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

三、节点

节点是独立的可执行文件,像细胞一样,可以执行机器人系统中的具体任务,不同的节点可以执行不同的功能,比如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接口

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

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

<exec_depend>rclpy</exec_depend>

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

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

3.添加入口点

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

'node_hello_world= herman_ROS_learning.node_print_hello_world:main',

案例形式:

entry_points={
   
   
    'console_scripts': [
    'node_print_hello_world= herman_ROS_learning.node_print_hello_world:main',
    ],
},

可以额外添加的内容

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

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

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

#!/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()

四、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
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:

② ros2 node list

查看当前存在的节点

ros2 node list
OUTPUT:
/turtlesim

五、对节点名进行重映射

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

--ros-args --remap __node:=new_name
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=renamed_turtle
INPUI:
ros2 node list 
OUTPUT:
/renamed_turtle
/turtlesim
相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
目录
相关文章
|
13天前
|
存储 缓存 监控
|
16天前
|
存储 负载均衡 监控
检索服务elasticsearch节点(Node)
【8月更文挑战第23天】
34 5
|
16天前
|
存储 JavaScript
DOM 节点列表长度(Node List Length)
名为 &quot;title&quot; 的元素节点,并存储在节点列表 x 中。通过 &quot;length&quot; 属性确定 x 的长度(即 &quot;title&quot; 节点总数)。利用 for 循环遍历整个列表,访问每个 &quot;title&quot; 节点的第一个子节点的值,并将其写入文档。
|
1天前
|
JavaScript
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
|
3天前
|
JavaScript
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
|
7天前
|
JavaScript
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
|
5天前
|
JavaScript
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
|
10天前
|
JavaScript
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
|
13天前
|
存储 负载均衡 算法
|
13天前
|
存储 缓存 监控

推荐镜像

更多