ros2 学习06 节点的定义及示例

ros2 中节点是什么?

机器人是各种功能的综合体,每一项功能就像机器人的一个工作细胞,众多细胞通过一些机制连接到一起,成为了一个机器人整体。

在ROS中,我们给这些 “细胞”取了一个名字,那就是节点。

比如控制底盘运行的节点,控制物体识别的是另外一个节点等等

通信模型
完整的机器人系统可能并不是一个物理上的整体,比如这样一个的机器人:

在这里插入图片描述
在机器人身体里搭载了一台计算机A,它可以通过机器人的眼睛——摄像头,获取外界环境的信息,也可以控制机器人的腿——轮子,让机器人移动到想要去的地方。除此之外,可能还会有另外一台计算机B,放在你的桌子上,它可以远程监控机器人看到的信息,也可以远程配置机器人的速度和某些参数,还可以连接一个摇杆,人为控制机器人前后左右运动。

这些功能虽然位于不同的计算机中,但都是这款机器人的工作细胞,也就是节点,他们共同组成了一个完整的机器人系统。

  • 节点在机器人系统中的职责就是执行某些具体的任务,从计算机操作系统的角度来看,也叫做进程;

  • 每个节点都是一个可以独立运行的可执行文件,比如执行某一个python程序,或者执行C++编译生成的结果,都算是运行了一个节点;

  • 既然每个节点都是独立的执行文件,那自然就可以想到,得到这个执行文件的编程语言可以是不同的,比如C++、Python,乃至Java、Ruby等更多语言。

  • 这些节点是功能各不相同的细胞,根据系统设计的不同,可能位于计算机A,也可能位于计算机B,还有可能运行在云端,这叫做分布式,也就是可以分布在不同的硬件载体上;

  • 每一个节点都需要有唯一的命名,当我们想要去找到某一个节点的时候,或者想要查询某一个节点的状态时,可以通过节点的名称来做查询。

节点也可以比喻是一个一个的工人,分别完成不同的任务,他们有的在一线厂房工作,有的在后勤部门提供保障,他们互相可能并不认识,但却一起推动机器人这座“工厂”,完成更为复杂的任务。

接下来,我们就来看看, 节点这个工作细胞,到底该如何实现。

示例: 新增一个节点并运行

  1. 创建一个python 功能包
ros2 pkg create --build-type ament_python learning_node
colcon build --packages-select learning_node

编译成功
在这里插入图片描述
设置环境变量

source install/local_setup.bash

成功创建功能包后 可以看到工作空间下多个一个目录,learning_node,

在这里插入图片描述
这个时候的learing_node 还有一个learing_node 的目录,我们的代码就放在这个目录里

编写代码

新增helloworld.py

代码如下

#!/usr/bin/env python3 
# -*- coding: utf-8 -*-

import rclpy                                   # ROS2 Python接口库
from rclpy.node import Node                    # ROS2 节点类
import time

def main(args=None):                           # ROS2节点主入口main函数
    rclpy.init(args=args)                      # ROS2 Python接口初始化
    node = Node("node_helloworld")             # 创建ROS2节点对象并进行初始化

    while rclpy.ok():                          # ROS2系统是否正常运行
        node.get_logger().info("Hello World")  # ROS2日志输出
        time.sleep(0.5)                        # 休眠控制循环时间

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

完成代码的编写后需要设置功能包的编译选项,让系统知道Python程序的入口,打开功能包的setup.py文件,加入如下入口点的配置:

 entry_points={
    
    
        'console_scripts': [
         'helloworld  = learning_node.helloworld:main',
        ],

重新编译功能包

colcon build --packages-select learning_node

编译成功:
在这里插入图片描述
运行测试节点

ros2 run learning_node helloworld

运行成功后日志打印如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/hai411741962/article/details/135101542