节点
节点就像机器人的工作细胞,负责执行某些具体任务的进程。
节点是独立运行的可执行文件,所以可以使用不同的编程语言。
一台机器的节点可以分布在多个计算机上,还可以分布在云端上。即可分布式运行在不同主机。
通过节点名称进行管理
创建节点
创建一个功能包
用VSCode或其他编辑器打开工作空间的文件夹,并进入src文件夹,你可以在src文件夹里新建功能包(上一节的内容),比如我们这里创建一个python功能包,就叫learning_node(cd到src!):
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
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,每创建一个节点,我们都需要在这个列表里添加上去
比如此处,我们添加:
'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类呢?
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的那个列表里添加:
'node_helloworld = learning_node.node_helloworld_class:main',记得先编译,修改才能生效
古月居的教程后面实际上是在讲opencv,看完opencv的教程应该就能理解了——但我不推荐直接sudo apt install来安装opencv库,python最好还是弄个虚拟环境,这个之前也提到过。
诚然,节点可以独立运行,它是可以独立运行的可执行程序。但是不同的节点之间肯定要进行通信,比如要让手柄控制机器人的某个部位什么的,这就是下一节——话题
