节点是执行具体任务的一个进程,是机器人的“细胞”,具有以下特点:
1 节点为独立的可执行文件
2 节点可以使用不同编程语言
3 节点可以分布式运行在不同主机
4 节点通过节点名称进行管理
节点的生命周期:
1 编程接口初始化
2 创建节点并初始化
3 实现节点功能
4 销毁节点并关闭接口
示例:hello world输出
面向过程版本:
import rclpy
from rclpy.node import Node
import time
def main(args=None):
rclpy.init(args=args)
node = Node("node_helloworld")
while rclpy.ok():
node.get_logger().info("Hello World")
time.sleep(0.5)
node.destroy_node()
rclpy.shutdown()
程序说明:
1 from rclpy.node import Node
我们这个程序作为一个节点,因而要引入Node库
2 rclpy.init(args=args)
初始化python接口,所有程序在主方法里都要加这一行
3 node = Node(“node_helloworld”)
在引入Node库后,创建一个Node对象node,其中参数"node_helloworld"为该节点名称,在程序运行时通过node_helloworld来调用该节点
4 while rclpy.ok():
rclpy.ok()条件代表ROS2系统正常运行,因此在该程序里除非强制退出(如ctrl + C)会一直打印Hello World
5 node.get_logger().info(“Hello World”)
该方法在终端打印"Hello World"
6 node.destroy_node()
在打印完成后,删除该节点释放内存
7 rclpy.shutdown()
关闭python接口
对于python文件,还需要定义初始化文件:
(以下为setup部分)
entry_points={
'console_scripts': [
'node_helloworld = learning_node.node_helloworld:main'
]
},
在这里声明node_helloworld节点入口点在learning_node文件夹,node_helloworld文件,main函数下
利用面向对象实现hello world
import rclpy
from rclpy.node import Node
import time
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.destroy_node()
rclpy.shutdown()
在这里,我们建立一个HelloWorldNode类作为节点对象node
1 def init(self, name):
super().init(name)
调用父类方法进行初始化
在setup文件里进行入口声明:
entry_points={
'console_scripts': [
'node_helloworld = learning_node.node_helloworld:main',
'node_helloworld_class = learning_node.node_helloworld_class:main'
]
},
在对程序进行修改后一定要重新编译。因为ROS2读取的是install文件夹下面的程序而每次编译会把src下面的程序复制到install下,如果没有编译会导致运行的还是旧版程序
额外内容:
1 用colcon build编译时出现以下权限报错:
看报错信息是没有创建日志文件的权限,但是如果加上sudo 又会有其他报错内容。这里直接开root权限就可以解决
2 ROS2打开摄像头:
在设置里把USB设置改为USB3.1
在下方摄像头选项里找到摄像头



