1. 启程
1.1 编写简单的Python节点:
import rclpy
from rclpy.node import Node
def main():
rclpy.init()
node = Node("python_node")
node.get_logger().info('hello stone')
rclpy.spin(node)
rclpy.shutdown
if __name__=="__main__":
main()
先导入rclpy库,再从rclpy库的node模块中导入Node类rclpy.init()
用于分配资源,然后创建了python_node
的节点。node.get_logger()
用于获取日志记录器然后调用info
输出内容,
spin用于启动节点,它会不断地循环检查其运行的节点是否有新的话题数据等,直到节点被关闭,然后rclpy.shutdown()
用于清除分配的资源并确认节点是否已关闭。
通过python3 1.py
运行节点,然后再通过ros2 node list
显示出刚才创建的节点。
1.2 功能包:
通过上述可以看出我们可以编写一个节点,如果需要编写多个节点且需要对其进行管理,此时单个操作将变得麻烦,而此时ros2给我们提供了管理节点的工具--功能包。
首先通过ros2 pkg create <包名>
创建功能包,可以看到主文件夹多出来一个demo_pkg
的功能包。后面的--build-type ament_python
表示指定功能包的构建类型为ament_python
。
打开此功能包发现其中有demo_pkg
:
该目录与功能包名相同,用于存储节点代码,而此目录中存在__init__.py
是python包的标识文件,默认为空。resouce
:
该目录可以放置一些资源而其中的demo_pkg
为了提供功能包标识,无需更改。test
:
用于存放测试文件。暂不了解。package.xml
:
该文件为功能包的清单文件,文件中声明了功能包的名称,版本标号,功能包管理者,依赖,构建类型。setup.cfg
:
普通的文本文件,放置构建python包时的配置。setup.py
:
脚本文件,含有setup()
函数,用于指定如何构建和安装python包,例如添加节点时需要在其中声明可执行文件的名称与对应的函数。
1.3 在功能包中运行python文件
首先便是在demo_pkg
目录下创建节点文件,并下代码如下:
可以发现此代码缺少调用main函数的代码,而运行main函数则需要在setup.py
中告诉功能包main函数位置
当执行pyhon_node
时就相当于执行demo_pkg
目录下python_node
文件中的main函数,同时在package.xml
中添加依赖,