Skip to content

节点

  • 节点就像机器人的工作细胞,负责执行某些具体任务的进程

  • 节点是独立运行的可执行文件,所以可以使用不同的编程语言。

  • 一台机器的节点可以分布在多个计算机上,还可以分布在云端上。即可分布式运行在不同主机

  • 通过节点名称进行管理


创建节点

创建一个功能包

用VSCode或其他编辑器打开工作空间的文件夹,并进入src文件夹,你可以在src文件夹里新建功能包(上一节的内容),比如我们这里创建一个python功能包,就叫learning_node(cd到src!):

bash
ros2 pkg create --build-type ament_python learning_node

将看到python功能包的基本结构:

learning_node: 名字与功能包的名字相同,python模块根目录,存放所有python代码

resource: 资源目录(存放配置,模型等文件)

test: 测试目录

package.xml: ROS2功能包核心配置文件

setup.cfg: setuptools构建配置文件

setup.py: python包构建脚本

编写节点代码

在learning_node/learning_node文件夹里新建python文件:node_helloworld.py

python
import rclpy		# ROS2 python接口库

from rclpy.node import Node		# ROS2节点类

import time


def main(args = None):		# 节点主入口main函数

    rclpy.init(args=args)		# 初始化

    node = Node("node_helloworld")		# 创建名字为node_helloworld的Node类的实例


    while rcply.ok():		# rcply.ok为真时循环,按下Ctrl C 后为false

	    node.get_logger().info("Hello World")	

	    time.sleep(0.5)


    node.destroy_node()		# 销毁对象释放内存

    rclpy.shutdown()		# 关闭接口

python功能包程序入口配置

编写完代码后找到setup.py,这就是配置脚本。

可以看到entry_points里有一个python列表叫console_scripts,每创建一个节点,我们都需要在这个列表里添加上去

比如此处,我们添加:

python
'node_helloworld	= learning_node.node_helloworld:main',

可以看出格式为:your_node_name = your_folder_name.your_python_file_name:you_main_function_name

运行节点

格式:ros2 run your_package_name your_node_name。(如果没有编译要先编译:colcon build)

your_package_name为节点所在功能包的名称,your_node_name为节点名称

面向对象

我们可以再新建一个python_file,就叫它node_helloworld_class.py吧

代码功能和上一个一模一样,只不过我们既然导入了Node类,那么何不用面向对象编程,去继承这个Node类呢?

python
class HelloWorldNode(Node):

	def __init__(self,name):

		super().__init__(name)

		while rclpy.ok():

			self.get_logger().info("Hello World")

			time.sleep(0.5)


def main(args=None):

	rclpy.init(args=args)

	node = HelloWorldNode("node_helloworld_class")

	node.destory_node()

	rclpy.shutdown()

setup.py的那个列表里添加:

python
'node_helloworld	= learning_node.node_helloworld_class:main',

记得先编译,修改才能生效


古月居的教程后面实际上是在讲opencv,看完opencv的教程应该就能理解了——但我不推荐直接sudo apt install来安装opencv库,python最好还是弄个虚拟环境,这个之前也提到过。

诚然,节点可以独立运行,它是可以独立运行的可执行程序。但是不同的节点之间肯定要进行通信,比如要让手柄控制机器人的某个部位什么的,这就是下一节——话题