ROS2教程 03 节点Node

本文涉及的产品
资源编排,不限时长
简介: 本文是关于ROS2(机器人操作系统2)的教程,介绍了ROS2的节点概念、与ROS1的区别、节点的编写和基本流程、ros2的node相关命令,以及如何对节点名进行重映射,旨在帮助读者理解ROS2中节点的创建和操作。

学习ROS2前需要对ROS1有所了解,可以通过访问ROS1文档学习:
ROS1相关文档

一、ROS2运行示意图

在这里插入图片描述

二、与ros1的区别

以下是ros1的node命令包含的内容,可以明显发现两者的不同,如果只学习ros2,则可以不用了解

 rosnode ping                                                    test connectivity to node
rosnode list                                                     获取列表 list active nodes
rosnode info                                                     获取节点信息 print information about node
rosnode machine                                     list nodes running on a particular machine or list machines
rosnode kill                                                     kill a running node
rosnode cleanup                                         purge registration information of unreachable nodes
AI 代码解读

三、节点

节点是独立的可执行文件,像细胞一样,可以执行机器人系统中的具体任务,不同的节点可以执行不同的功能,比如A节点负责视觉 B节点负责运动控制 C节点负责导航
节点可以分布在不同的硬件载体上,节点之间可以进行通信
不同节点可以用不同的编程语言来写

① 编写节点的思想

编写节点的思想和编程类似,可以面向过程,也可以面向对象
对于复杂的机器人,通常使用面向对象的思想,做到模块化

② 编写节点的基本流程

1.编程接口初始化
2.创建节点并初始化
3.实现节点功能
4.销毁节点并关闭接口

③ 尝试编写简单节点的内容

1.编写节点

使用面向过程思想,以python语言编写一个简单的节点,发布HelloWorld日志信息

#!/usr/bin/env python3 
# -*- coding: utf-8 -*-
import rclpy # rclpy是ROS Client Library for Python的缩写,与Node有关的内容在这个库中
from rclpy.node import Node 
import time #引入time库

# 下面的部分是ROS2节点主入口main函数
def main(args=None): # 主函数
    rclpy.init(args=args) # 初始化 rclpy ROS2的python接口
    nodename = Node("node_print_hello_world")# 创建ROS2节点对象并进行初始化
    while rclpy.ok():# 当系统正常运行
        nodename.get_logger().info("Hello World!")  # 日志输出
        time.sleep(1)                        # time休眠循环
    nodename.destroy_node()
    rclpy.shutdown() #关闭ROS2的Python接口
AI 代码解读

2.为节点代码的编译添加依赖

代码中有用到一些依赖包,在编译前写好依赖
在功能包目录下打开package.xml,修改以下内容
必须添加的内容
当功能包里的代码被执行时,这些语句声明了功能包的依赖

<exec_depend>rclpy</exec_depend>
AI 代码解读

可以额外添加的内容
例子:

<description>Print log “Hello World! ”per second</description>
<maintainer email="hermanye233@icloud.com">Herman Ye</maintainer>
<license>Apache License 2.0</license>
AI 代码解读

3.添加入口点

添加入口点让系统知道Python程序的入口在哪儿
必须添加的内容
打开setup.py,添加入口点
在entry_points下的这个位置添加以下命令

'node_hello_world= herman_ROS_learning.node_print_hello_world:main',
AI 代码解读

案例形式:

entry_points={
   
   
    'console_scripts': [
    'node_print_hello_world= herman_ROS_learning.node_print_hello_world:main',
    ],
},
AI 代码解读

可以额外添加的内容

maintainer='Herman Ye',
maintainer_email='hermanye233@icloud.com',
description='Print log “Hello World! ”per second',
license='Apache License 2.0',
AI 代码解读

4.检查setup.cfg【可选】

setup.cfg是自动填写的,它将功能包的可执行文件放入lib中,ros2 run将会在lib中查找这些执行性文件是否存在并调用

[develop]
script_dir=$base/lib/herman_ROS_learning
[install]
install_scripts=$base/lib/herman_ROS_learning
AI 代码解读

同理,可以观察一下面向对象的编程方法,这样方便移植以及模块化

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import time
import rclpy # rclpy是ROS Client Library for Python的缩写,与Node有关的内容在这个库中
from rclpy.node import Node 
"""
面向对象
"""
class HelloWorldNode(Node): # Node为这个类的父类

    def __init__(self,nodename):
        super().__init__(nodename) # 调用父类中Node的构造函数,赋名根据提供的参数nodename来
        while rclpy.ok():# 当系统正常运行
            self.get_logger().info("Hello World!")  # 日志输出
            time.sleep(1)                        # time休眠循环

def main(args=None): # 主函数
    rclpy.init(args=args) # 初始化 rclpy

    node= HelloWorldNode("node_hello_world_class") # 创建ROS2节点对象并初始化

    rclpy.spin(node) # 循环等候着销毁的到来


    node.destroy_node() #销毁节点对象
    rclpy.shutdown() #关闭接口


if __name__ == '__main__': # 该条下的所有代码仅当本脚本直接执行时会触发,如果在其他文件引用本文件,则不会触发以下的代码
    main()
AI 代码解读

四、ros2中的node相关命令

ros2的node命令仅包含两项,node info与node list

① ros2 node info

输出节点的信息,包括Subscriber, Publisher, Service Servers, Service Clients, Action Servers, Action Clients

ros2 node info /turtlesim
AI 代码解读
OUTPUT:
/turtlesim
  Subscribers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /turtle1/cmd_vel: geometry_msgs/msg/Twist
  Publishers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /rosout: rcl_interfaces/msg/Log
    /turtle1/color_sensor: turtlesim/msg/Color
    /turtle1/pose: turtlesim/msg/Pose
  Service Servers:
    /clear: std_srvs/srv/Empty
    /kill: turtlesim/srv/Kill
    /reset: std_srvs/srv/Empty
    /spawn: turtlesim/srv/Spawn
    /turtle1/set_pen: turtlesim/srv/SetPen
    /turtle1/teleport_absolute: turtlesim/srv/TeleportAbsolute
    /turtle1/teleport_relative: turtlesim/srv/TeleportRelative
    /turtlesim/describe_parameters: rcl_interfaces/srv/DescribeParameters
    /turtlesim/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
    /turtlesim/get_parameters: rcl_interfaces/srv/GetParameters
    /turtlesim/list_parameters: rcl_interfaces/srv/ListParameters
    /turtlesim/set_parameters: rcl_interfaces/srv/SetParameters
    /turtlesim/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
  Service Clients:

  Action Servers:
    /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
  Action Clients:
AI 代码解读

② ros2 node list

查看当前存在的节点

ros2 node list
AI 代码解读
OUTPUT:
/turtlesim
AI 代码解读

五、对节点名进行重映射

当需要为节点单次重新起名时,在启动节点命令后补充如下命令,该节点这次将以重映射后的名字运行并存在node list中,该节点可以作为和原名一样的对象和其他节点进行交互,比如turtle_teleop_key也可以操纵重命名后的turtle
可以通过重映射命令创建多个不同名称的同类型对象。

--ros-args --remap __node:=new_name
AI 代码解读
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=renamed_turtle
AI 代码解读
INPUI:
ros2 node list 
OUTPUT:
/renamed_turtle
/turtlesim
AI 代码解读
相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
相关文章
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
2024年5月node.js安装(winmac系统)保姆级教程
本篇博客为2024年5月版Node.js安装教程,适用于Windows和Mac系统。作者是一名熟悉JavaScript与Vue的大一学生,分享了Node.js的基本介绍、下载链接及简单安装步骤。安装完成后,通过终端命令`node -v`验证版本即可确认安装成功。欢迎关注作者,获取更多技术文章。
63 2
2024年5月node.js安装(winmac系统)保姆级教程
Twaver-HTML5基础学习(8)拓扑元素(Element)_网元(Element)、节点(Node)
本文介绍了Twaver HTML5中的拓扑元素(Element),包括网元(Element)、节点(Node)和连线(Link)的基本概念和使用方法。文章详细解释了Element的属性和方法,并通过示例代码展示了如何在React组件中创建节点、设置节点属性和样式。
117 1
Twaver-HTML5基础学习(8)拓扑元素(Element)_网元(Element)、节点(Node)
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)

热门文章

最新文章

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等