ROS2教程03 ROS2节点

ROS2节点

版权信息

Copyright 2023 Herman Ye@Auromix. All rights reserved.

This course and all of its associated content, including but not limited to text, 
images, videos, and any other materials, are protected by copyright law. 
The author holds all rights to this course and its contents.

Any unauthorized use, reproduction, distribution, or modification of this course 
or its contents is strictly prohibited and may result in legal action. 
This includes, but is not limited to:
Copying or distributing course materials without express written permission.
Reposting, sharing, or distributing course content on any platform without proper attribution and permission.
Creating derivative works based on this course without permission.
Permissions and Inquiries

If you wish to use or reproduce any part of this course for purposes other than personal learning, 
please contact the author to request permission.

The course content is provided for educational purposes, and the author makes no warranties or representations 
regarding the accuracy, completeness, or suitability of the course content for any specific purpose. 
The author shall not be held liable for any damages, losses, 
or other consequences resulting from the use or misuse of this course.

Please be aware that this course may contain materials or images obtained from third-party sources. 
The author and course creator diligently endeavor to ensure that these materials 
are used in full compliance with copyright and fair use regulations. 
If you have concerns about any specific content in this regard, 
please contact the author for clarification or resolution.

By enrolling in this course, you agree to abide by the terms and conditions outlined in this copyright notice.

学习目标

  • 熟悉ROS2的节点概念
  • 了解ROS2节点相关的命令行工具操作
  • 熟悉节点的代码编写和编程思想

难度级别

初级中级高级

预计耗时

30 mins

学习前提

对象类型状态
ROS2 Humble软件已安装
Ubuntu22.04操作系统软件已确认
Shell的基本使用知识已了解

什么是节点(Node)?

ROS 中的每个节点(Node)通常负责单一的模块化目的,例如控制车轮电机或发布来自激光测距仪的传感器数据。每个节点都可以通过主题(Topic)、服务(Service)、操作(Action)或参数(Parameter)从其他节点发送和接收数据。

在这里插入图片描述

节点的特性

  • 节点是独立的
    每个节点都具备独立性,负责执行特定的模块化任务
  • 节点负责执行机器人系统中的具体任务
    不同的节点可以负责机器人系统中的不同任务,例如一个节点(A节点)可以处理视觉数据,另一个节点(B节点)可以负责运动
  • 节点可以分布在不同的硬件载体上
    节点之间的通信可以跨架构,例如PC是x86架构的,而机器人身上的主控是arm架构的,两个不同的硬件载体上的节点都可以发送和接收数据
  • 不同节点可以用不同的编程语言来写
    节点可以用Python和C++编写,并且功能基本一致,因此不需要考虑编程语言的区别

如何使用一个节点?

要使用一个ROS 2节点,可以使用 ros2 run 命令来启动位于相应功能包(Package)中的可执行文件(节点)。以下是使用此命令的步骤:

  1. 打开终端窗口。

  2. 使用以下命令格式启动节点:

    ros2 run <package_name> <executable_name>
    

    这里,<package_name> 是功能包的名称,而 <executable_name> 是要启动的节点的可执行文件名称。

    例如,如果要启动位于 turtlesim 功能包中的 turtlesim_node 节点,可以执行以下命令:

    ros2 run turtlesim turtlesim_node
    

    这将启动 turtlesim_node 节点,使用乌龟仿真(Turtlesim)功能包中的模拟乌龟控制器。可以根据功能包和节点的名称来自定义命令,以启动需要的节点。

如何查看节点相关的信息?

要查看节点相关的信息,可以使用以下命令:

  1. 列出当前正在运行的所有节点,使用 ros2 node list 命令:

    ros2 node list
    

    这将显示当前正在运行的所有ROS 2节点的名称列表。

  2. 如果想要启动另一个节点并查看更新后的节点列表,可以执行以下步骤:

    • 首先,启动一个新的节点,例如 turtle_teleop_key,使用以下命令:

      ros2 run turtlesim turtle_teleop_key
      
    • 然后,检查当前节点列表,使用 ros2 node list 命令:

      ros2 node list
      

    这将列出包括新启动的 turtle_teleop_key 节点在内的所有节点名称。

  3. 若要查看有关特定节点的详细信息,可以使用 ros2 node info 命令,后跟节点名称,如下所示:

    ros2 node info <node_name>
    

    其中 <node_name> 是要查看详细信息的节点的名称。这将显示有关节点的各种信息,包括节点的交互信息和自身的参数。

如何编写一个节点?

节点编写的基本思想

编写一个节点与一般编程相似,可以采用面向过程或面向对象的编程思想。对于复杂的机器人应用,通常使用面向对象的思想,以实现模块化和可维护性。

节点编写的基本流程

编写一个节点的基本流程包括以下步骤:

  1. 编程API初始化: 首先,需要初始化ROS的编程接口,比如rclpyrclpy是ROS Client Library for Python的缩写,与Node有关的内容在这个库中。

  2. 创建节点并初始化: 接下来,创建一个节点并进行初始化。节点是机器人应用中的基本单元,负责执行特定的任务或功能。

  3. 实现节点功能: 在节点中实现具体的功能。这包括处理传感器数据、执行动作、通信等任务,根据应用需求编写相应的代码。

  4. 销毁节点并关闭接口: 最后,在节点的工作完成后,需要销毁节点并关闭编程接口,释放资源并确保系统正常退出。

示例:编写一个简单的节点

0.前置工作

如果尚未创建功能包来保存代码,那么需要先创建一个功能包,功能包是实现ROS2中基本功能的一个单位,此处不作讨论,将在之后的课程中讲解。

# Go to your src
cd ~/ros2_workspace/src
# Create ros2_learning package
ros2 pkg create --build-type ament_python ros2_learning

1.编写代码

下面是一个使用面向过程编程思想,以Python语言编写一个发布"Hello World"日志信息的简单节点的示例代码:

# Go to package
cd ros2_learning/ros2_learning
# Create file
touch hello_world_demo.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Description: Python ROS2 demo(面向过程编程)
import rclpy  # rclpy是ROS 2的Python客户端库,用于与ROS 2相关的操作。
from rclpy.node import Node  # 引入Node类
import time  # 引入time库


# 下面的部分是ROS2节点主入口main函数
def main(args=None):  # 主函数
    rclpy.init(args=args)  # 初始化 rclpy ROS2的python编程接口
    nodename = Node("hello_world_demo_procedural_programming")  # 创建ROS2节点对象并进行初始化
    while rclpy.ok():  # 当ROS就绪并正常运行
        nodename.get_logger().info("Hello World!")  # 发布日志信息
        time.sleep(1)                        # 休眠1秒
    nodename.destroy_node()  # 销毁节点
    rclpy.shutdown()  # 关闭ROS2的Python接口


if __name__ == '__main__':
    main()

这个示例代码演示了一个简单节点的编写过程,它初始化ROS2接口,创建节点对象,循环发布"Hello World"的日志信息,然后在系统退出时销毁节点和关闭接口。

更为推荐的做法是采用面向对象的编程方法。机器人自身天然适合作为对象来进行建模和控制。如果打算采用面向对象的方法来开发机器人控制软件,以下是一些示例代码,以帮助更好地理解和实施这一方法:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Description: 这是一个 Python ROS2 示例,演示了如何使用ROS 2中的面向对象编程。

import time
import rclpy  # rclpy是ROS 2的Python客户端库,用于与ROS 2相关的操作。
from rclpy.node import Node  # 引入Node类


class HelloWorldNode(Node):
    def __init__(self, node_name):
        super().__init__(node_name)  # 调用父类 Node 的构造函数,使用提供的节点名称进行初始化。
        while rclpy.ok():  # 当系统正常运行时
            self.get_logger().info("Hello World!")  # 记录日志输出 "Hello World!"
            time.sleep(1)  # 休眠1秒,然后再循环。


def main(args=None):
    rclpy.init(args=args)  # 初始化ROS 2
    node = HelloWorldNode("hello_world_demo_object_oriented_programming")  # 创建一个ROS 2节点对象并初始化。
    rclpy.spin(node)  # 进入ROS的循环,等待节点销毁信号。
    node.destroy_node()  # 销毁节点对象。
    rclpy.shutdown()  # 关闭ROS 2接口。


if __name__ == '__main__':
    main()

2.为功能包添加依赖

在代码的编译或者运行过程中,通常需要引入一些外部依赖包。为了确保编译或运行顺利进行,我们需要在功能包目录下的package.xml文件中声明这些依赖项。下面是必须添加的内容:

<exec_depend>rclpy</exec_depend>

这些语句表明了功能包的依赖关系,以确保在功能包的代码执行时所需的依赖包已经安装。
此外,你还可以添加额外的信息,比如功能包的描述、维护者和许可证,如示例所示:

<description>ROS2 learning demos</description>
<maintainer email="hermanye233@icloud.com">Herman Ye</maintainer>
<license>Apache License 2.0</license>

在这里插入图片描述

3.添加入口点

为了使系统知道 Python 程序的入口点在哪里,你需要在setup.py文件中添加入口点。下面是必须添加的内容:

  • 打开setup.py,添加入口点
    在entry_points下的这个位置添加以下命令
"hello_world_demo_node = ros2_learning.hello_world_demo:main",

这行代码定义了一个入口点,它告诉系统如何运行功能包中的节点。具体示例形式如下:

    entry_points={
        "console_scripts": [
            "hello_world_demo_node = ros2_learning.hello_world_demo:main",
        ],
    },
)

此外,你还可以添加一些额外的信息,如维护者、维护者的电子邮件地址、功能包描述和许可证信息:

maintainer='Herman Ye',
maintainer_email='hermanye233@icloud.com',
description='ROS2 learning demos',
license='Apache License 2.0',

在这里插入图片描述

4. 检查 setup.cfg【可选】

setup.cfg 文件是用于配置 Python 包的元数据和其他信息的文件,尤其是用于定义 Python 包的 setuptools 配置。 ROS2 功能包也使用 setup.cfg 来配置包的元数据和依赖关系。

[develop]

  • script_dir=$base/lib/ros2_learning:这个部分通常用于配置在开发模式下(使用python setup.py develop)运行包时的一些参数。script_dir 参数指定了脚本的目录,通常这些脚本用于在开发期间启动和管理功能包。在这里,$base 是一个变量,它可能代表功能包的根目录,这个参数告诉 ROS 或 setuptools,在开发模式下,将脚本放在 lib/ros2_learning 目录中。

[install]

  • install_scripts=$base/lib/ros2_learning:这个部分通常用于配置在安装功能包时(使用python setup.py install)将哪些文件复制到安装目录中。install_scripts 参数指定要安装的脚本文件的目录。在这里,与 [develop] 部分类似,$base 可能代表功能包的根目录,该参数告诉 setuptools 或 ROS 在安装包时将脚本文件复制到 lib/ros2_learning 目录中。

它在这个功能包里的作用是指定功能包的可执行文件所在的目录,这些可执行文件将被放置在lib目录下。这些配置确保了在使用ros2 run命令时,系统将会在lib目录中找到这些可执行文件并执行它们。

以下是setup.cfg文件的示例内容:

[develop]
script_dir=$base/lib/ros2_learning

[install]
install_scripts=$base/lib/ros2_learning

需要注意的是,setup.cfg文件通常是自动生成的,无需手动编辑,除非有特殊需求。
在这里插入图片描述

5.编译工作空间

在最后,编译工作空间,相关命令在之后的课程里会讲解,此处不涉及。

# Go to your workspace
cd ~/ros2_workspace
# Build workspace
colcon build --symlink-install

Troubleshooting:

  • 弃用警告

在这里插入图片描述

ROS2的工作空间编译使用了setuptools,ROS2 Rolling 到 Python3.10 的过渡最近才发生,这可能是由此产生的问题之一,因此需要执行以下命令:

pip install setuptools==58.2.0

在这里插入图片描述

重新编译工作空间,该错误不再发生。
在这里插入图片描述

6.测试节点

# Set workspace env in current terminal
source ~/ros2_workspace/install/setup.bash
# Run hello world demo node
ros2 run ros2_learning hello_world_demo_node

ROS2的node相关命令行工具

ROS 2的节点相关命令行工具提供了轻松管理ROS 2节点的能力。比如说ros2 node inforos2 node list
在这里插入图片描述

① ros2 node info

ros2 node info命令允许用户获取有关特定节点的详细信息,包括其订阅者(Subscribers)、发布者(Publishers)、服务服务器(Service Servers)、服务客户端(Service Clients)、动作服务器(Action Servers)和动作客户端(Action Clients)等信息。这是通过提供节点的名称作为参数来实现的。

例如,要检索有关名为"turtlesim"的节点的信息,可以执行以下命令:

ros2 node info /turtlesim

在这里插入图片描述

② ros2 node list

ros2 node list命令用于查看当前运行的ROS 2节点的列表。这有助于用户了解系统中哪些节点处于活动状态,以及可以使用哪些节点进行通信或监控。执行此命令后,将列出所有活跃的ROS 2节点的名称。

ros2 node list

在这里插入图片描述

③ 对节点名进行重映射

有时可能会需要进行节点名称的重新映射,以便在ROS 2中为节点提供新的标识。这个过程允许在运行节点时,为其指定一个不同的名称,从而使其能够在整个系统中以新名称运行,同时保留原始节点的功能。这种功能对于实现多节点系统以及避免名称冲突非常有用,特别是需要启动多个相同的节点时,可以通过重映射命令创建多个不同名称的同类型对象。

要进行节点名称的重新映射,可以使用--ros-args参数和--remap选项,其语法如下:

ros2 run package_name executable_name --ros-args --remap __node:=new_node_name

这里的package_name代表ROS 2软件包名称,executable_name是要运行的节点的可执行文件名称,original_node_name是原始节点名称,而new_node_name则是希望为节点分配的新名称。

例如,如果同时要运行两个小乌龟的demo,想要将名为"turtlesim_node"的节点的名称从"/turtlesim"重映射为"/renamed_turtle",可以使用以下命令:

ros2 run turtlesim turtlesim_node --ros-args --remap __node:=renamed_turtle

在这里插入图片描述

可以看到通过--remap成功修改了要启动的节点名,不再是/turtlesim而是/renamed_turtle
在这里插入图片描述
思考:
如果不重映射名字,同时开两个小乌龟节点会发生什么?
如果此时进行速度控制,又会发生什么?
如果分别给两个小乌龟节点起不同的名字,此时再运行速度控制节点,又会发生什么?
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/220250.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在机器学习或者深度学习中是否可以直接分为训练集和测试集而不需要验证集?我的答案如下:

文章目录 一、训练集是什么&#xff1f;二、验证集是什么&#xff1f;三、测试集是什么&#xff1f;四、是否可以直接分为训练集和测试集而不需要验证集&#xff1f;总结 在机器学习和深度学习项目中&#xff0c;通常会将数据集划分为三个部分&#xff1a;训练集&#xff0c;验…

python精细讲解,从代码出发,适合新手宝宝食用的python入门教学【持续更新中】

文章目录 1、输入输出1.1 输入语句1.2 输出语句 2、List列表操作2.1 取值取单个元素&#xff1a;[]取出现的第一个元素&#xff1a;index 2.2 添加操作追加&#xff1a;append插入&#xff1a;insert 2.3 删除操作removepopdelclear清空 copy复制操作列表相关的数学操作数数&am…

c语言指针详解(上)

目录 一、指针的基本概念和用法 二、指针运算 2.1 指针的自增和自减运算 2.2 指针的自增和自减运算 三、数组和指针 四、指针和函数 4.1 在函数中使用指针作为参数和返回值 4.1.1 使用指针作为函数参数 4.1.2 使用指针作为函数返回值 4.2 指针参数的传值和传引用特性 4.2.1 指针…

【Maven】清理 maven 仓库

初始情况下&#xff0c;我们的本地仓库是没有任何jar包的&#xff0c;此时会从私服去下载&#xff08;如果没有配置&#xff0c;就直接从中央仓库去下载&#xff09;。 可能由于网络的原因&#xff0c;jar包下载不完全&#xff0c;这些不完整的jar包都是以lastUpdated结尾。此…

Web 应用程序性能测试核心步骤

通常大家做web 应用程序的时候会有哪些操作呢&#xff1f;今天就来看看常见的web 应用程序的常见操作。 Web 应用程序性能测试核心步骤 1&#xff1a;识别测试环境。确定物理测试环境和生产环境&#xff0c;以及测试团队可用的工具和资源。物理环境包括硬件、软件和网络配置。…

面试就是这么简单,offer拿到手软(三)—— 常见中间件框架面试题,es,redis,dubbo,zookeeper kafka 等

面试就是这么简单&#xff0c;offer拿到手软&#xff08;一&#xff09;—— 常见非技术问题回答思路 面试就是这么简单&#xff0c;offer拿到手软&#xff08;二&#xff09;—— 常见65道非技术面试问题 面试就是这么简单&#xff0c;offer拿到手软&#xff08;三&#xff…

Linux中shell的运行原理

在Linux中&#xff0c;每次输入命令时&#xff0c;前面都会出现一串字母&#xff0c;我们称之为命令行提示符 实际上&#xff0c;命令行提示符是一种外壳程序 外壳程序的概念&#xff1a; 前面我们提到过&#xff0c;在Linux中&#xff0c;一切皆文件&#xff0c;所谓的命令就…

关于神舟-战神TA5NS系统重装问题

加装固态卡在log处无法开机问题 下面是我的步骤 1.按f7选择pe安装系统&#xff0c;然后发现卡在战神log处不转动 2.下载驱动 TA5NS驱动地址 下载RAID驱动&#xff08;如果没有私信我&#xff0c;我网盘里有&#xff09;&#xff0c;拷到u盘中&#xff0c;然后进入pe系统里面…

深度学习之网络优化与正则化

视频链接&#xff1a;7.1 神经网络优化的特点_哔哩哔哩_bilibili 神经网络优化的特点 网络优化的难点 &#xff08;1&#xff09;网络结构差异大&#xff1a;不同模型之间的结构差异大——没有通用的优化算法、超参数多 &#xff08;2&#xff09;非凸优化问题&#xff1a;…

仓库管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a; 更多系统资源库地址&#xff1a;更多Java课设系统 更多系统运行效果展示…

十三、FreeRTOS之FreeRTOS时间管理

本节主要介绍以下内容&#xff1a; 1&#xff0c;延时函数介绍&#xff08;了解&#xff09; 2&#xff0c;延时函数解析&#xff08;熟悉&#xff09; 3&#xff0c;延时函数演示实验&#xff08;掌握&#xff09; 4&#xff0c;课堂总结&#xff08;掌握&#xff09; 一、…

华盛顿特区警方推荐购买 AirTag防止高端夹克被窃

根据美国媒体 Fox5 报道&#xff0c;近期由于天气变冷&#xff0c;华盛顿特区已发声多起高端 Canada Goose 夹克被窃事件。这些被偷走的加拿大鹅夹克价格从几百到几千美元不等&#xff0c;“Canada Goose”LOGO较为明显&#xff0c;很容易被小偷发现。 对此&#xff0c;警方建…

基于javaweb存钱小管家网页计划书

基于javaweb存钱小管家网页计划书 系统开发工具&#xff1a;idea 编程语言&#xff1a;Javaweb 数据库&#xff1a;MySQL 用户功能大致如下 需求 1. 功能性需求&#xff1a; &#xff08;1&#xff09;通用功能&#xff1a; 用户、管理员&#xff1a;用户包括注册和登录…

行业内卷严重到什么程度了?

一.内卷现状 最近大家都吐槽找工作难&#xff0c;确实很难。 不得不说&#xff0c;现在找工作的难度是以前的很多倍。甚至可以说地狱级都不为过。 以前只要简历一挂到网上&#xff0c;就有很多电话打过来。特别是在一线城市&#xff0c;各种类型企业的HR都来找&#xff0c;希…

【C++】POCO学习总结(九):网络

【C】郭老二博文之&#xff1a;C目录 1、Poco::Net::IPAddress IP地址 Poco::Net::IPAddress类存储IPv4或IPv6主机地址。 Poco::Net::IPAddress可以从字符串解析&#xff0c;也可以格式化为字符串。支持IPv4格式(d.d.d.d)和IPv6格式(x: x: x: x: x: x: x: x)。 常用函数&…

【Maven】安装和使用

1. Maven 概述 Maven 是一款用于管理和构建 java 项目的工具&#xff0c;可以进行依赖管理、统一项目结构和项目构建。 1.1 Maven 模型 项目对象模型 (Project Object Model)依赖管理模型(Dependency)构建生命周期/阶段(Build lifecycle & phases) 1.2 Maven 仓库 仓库的…

Educational Codeforces Round 159 (Rated for Div. 2) 之 A - E 题

目录 [A. Binary Imbalance](https://codeforces.com/contest/1902/problem/A)DescriptionSolutionCode [B. Getting Points](https://codeforces.com/contest/1902/problem/B)DescriptionSolutionCode [C. Insert and Equalize](https://codeforces.com/contest/1902/problem/…

7_企业架构MySQL读写分离

企业架构MySQL读写分离 学习目标和内容 1、能够理解读写分离的目的 2、能够描述读写分离的常见实现方式 3、能够通过项目框架配置文件实现读写分离 4、能够通过中间件实现读写分离 一、背景描述及其方案设计 1、业务背景描述 时间&#xff1a;2014.6.-2015.9 发布产品类型&…

美股电动汽车股票分析:蔚来和Rivian这两只都遭受了重创的股票,哪个更值得投资?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 Rivian(RIVN)和蔚来(NIO)都是目前美股市场上最受关注的电动汽车股票。虽然蔚来在全球最大的电动汽车市场中国扮演着重要角色&#xff0c;但Rivian也击败了很多传统汽车制造商&#xff0c;并成为了第一家在美国推出全电动皮…

1970-2022年中国省级国家级开发区数据集

1970-2022年Z国省级国家级开发区数据集 1、时间&#xff1a;1970-2022年 2、指标&#xff1a;单位名称、所属区域、所属省份、所属级别、开发区类型、关注热度、成立时间、核准面积、主导产业、地址、联系电话、经纬度 3、范围&#xff1a;2781个开发区 4、来源&#xff1a…