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入门实践
本课程将基于基础设施即代码 IaC 的理念,介绍阿里云自动化编排服务ROS的概念、功能和使用方式,并通过实际应用场景介绍如何借助ROS实现云资源的自动化部署,使得云上资源部署和运维工作更为高效。
目录
相关文章
|
Ubuntu 机器人 Linux
|
7月前
|
运维 Kubernetes API
解决Kubernetes集群中master节点无法与node节点通信的策略。
这些策略不仅需要执行命令来获取信息,更要深入理解集群组件如何交互,以便进行准确的故障定位与修复。一条一条地排查,并适时回顾配置文件,证书有效性等,通常可以找到问题所在。给出的命令需要根据具体环境的配置进行适当的修改。故障排除往往是一个细致且需求反复验证的过程,但遵循上述策略可以高效定位大部分通信故障的原因。
560 12
|
7月前
|
Kubernetes 网络协议 API
在k8s集群中解决master节点与node通信问题
整个排查和解决流程需要综合应用以上方法,以及根据具体情况调整排查顺序或应用其他技术细节。为保证解决方案的实用性和有效性,还需紧跟Kubernetes社区的最新动态和最佳实践。在实际操作过程中,应记录所采取的步骤和观察到的系统响应,以便在遇到类似问题时能够快速定位和解决。
519 8
|
8月前
|
机器学习/深度学习 Kubernetes 监控
Kubernetes 节点故障自愈方案:结合 Node Problem Detector 与自动化脚本
本文深入探讨了Kubernetes节点故障自愈方案,结合Node Problem Detector(NPD)与自动化脚本,提供技术细节、完整代码示例及实战验证。文章分析了硬件、系统和内核层面的典型故障场景,指出现有监控体系的局限性,并提出基于NPD的实时事件捕获与自动化诊断树的改进方案。通过深度集成NPD、设计自动化修复引擎以及展示内核死锁恢复的实战案例,文章详细说明了自愈流程的实现步骤与性能优势。此外,还提供了生产环境部署指南、高可用架构设计及安全防护措施,并展望了机器学习增强故障预测和混沌工程验证的进阶优化方向。全文约1.2万字,适合希望提升Kubernetes集群稳定性的技术人员阅读。
590 1
|
9月前
|
Ubuntu 机器人 Shell
在Jetson TX2的Ubuntu18.04系统中安装ROS的教程
所有这些步骤并不复杂,但确实需要仔细一点。如果遇到问题,不要灰心,问题是解决问题的开始。保持耐心,细心阅读错误信息,通常情况下,问题的答案就藏在其中。祝ROS旅程顺利!
304 18
|
JavaScript
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
|
11月前
|
资源调度 JavaScript 前端开发
前端开发必备!Node.js 18.x LTS保姆级安装教程(附国内镜像源配置)
本文详细介绍了Node.js的安装与配置流程,涵盖环境准备、版本选择(推荐LTS版v18.x)、安装步骤(路径设置、组件选择)、环境验证(命令测试、镜像加速)及常见问题解决方法。同时推荐开发工具链,如VS Code、Yarn等,并提供常用全局包安装指南,帮助开发者快速搭建高效稳定的JavaScript开发环境。内容基于官方正版软件,确保合规性与安全性。
10688 23
|
11月前
|
Kubernetes API 网络安全
当node节点kubectl 命令无法连接到 Kubernetes API 服务器
当Node节点上的 `kubectl`无法连接到Kubernetes API服务器时,可以通过以上步骤逐步排查和解决问题。首先确保网络连接正常,验证 `kubeconfig`文件配置正确,检查API服务器和Node节点的状态,最后排除防火墙或网络策略的干扰,并通过重启服务恢复正常连接。通过这些措施,可以有效解决与Kubernetes API服务器通信的常见问题,从而保障集群的正常运行。
901 17
|
Web App开发 JavaScript 前端开发
2024年5月node.js安装(winmac系统)保姆级教程
本篇博客为2024年5月版Node.js安装教程,适用于Windows和Mac系统。作者是一名熟悉JavaScript与Vue的大一学生,分享了Node.js的基本介绍、下载链接及简单安装步骤。安装完成后,通过终端命令`node -v`验证版本即可确认安装成功。欢迎关注作者,获取更多技术文章。
629 2
2024年5月node.js安装(winmac系统)保姆级教程
|
JavaScript
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)

热门文章

最新文章

推荐镜像

更多
  • ros