【ROS2】节点的含义及编写(python和C++)

注:以下内容为鱼香肉丝ROS2课程的内容整理,详细内容可查看其的课程内容。

什么是节点

节点的主要作用是订阅和发布话题、使用服务、配置参数和执行动作等。

其中的话题(topic)、服务(service)、参数(parameter)和动作(action)是ROS2的四大核心通信机制。

怎么用Python编写节点

直接编写步骤

① 新建文件ros2_python_node.py,并编写如下内容

python 复制代码
import rclpy
from rclpy.node import Node

def main():
    rclpy.init()
    node = Node("python_node")
    node.get_logger().info('hello')
    rclpy.spin(node)
    rclpy.shutdown()

if __name__=="__main__":
    main()

上述代码中:

**rclpy:**ROS2提供的Python版本客户端库

Node:rclpy库的node模块中的类

rclpy.init():为通信分配资源

**node = Node("python_node"):**实例化Node类

**node.get_logger().info('hello'):**通过node实例调用get_logger()获取日志记录器,并使用日志记录器的info方法输出"hello"

**rclpy.spin(node):**启动节点node,然后不断循环检查node是否接收到了新的话题数据等事件

**rclpy.shutdown():**清理分配的资源,确认节点是否关闭

② 使用Python执行节点

在终端中输入以下指令即可运行。

python 复制代码
python3 ros2_python_node.py

然后可以使用以下指令查看目前的节点列表,注意需要新开一个终端。

python 复制代码
ros2 node list

关于ros日志函数的解读:

打印日志的函数:node.get_logger().info('')、node.get_logger().warn('')......

可以有不同的配置

其输出是

第一列:表示不同的配置,info、warn之类的

第二列:表示时间戳,表示的是从1970年到现在的时间

第三列:表示节点的名字

第四列:表示打印的内容

日志的格式可以通过修改环境变量RCUTILS_CONSOLE_OUTPUT_FORMAT来修改

使用功能包组织Python节点

功能包:ROS2中用于组织和管理节点的工具,可以直接使用ROS2提供的构建指令对节点进行编译和安装。具体步骤为:

① 在终端中创建功能包

python 复制代码
ros2 pkg create demo_python_pkg --build-type ament-python --license Apache-2.0

ros2 pkg create:ROS2命令行工具pkg模块下用于创建功能包的命令

demo_python_pkg:功能包的名字

--build-type ament_python:表示指定功能包的构建类型为ament_python

--license Apache-2.0:用于声明功能包的开源协议

② 在功能包中编写代码文件

编写位置:在demo_python_pkg/demo_python_pkg下新建一个python文件python_node.py

在文件中输入以下内容:

python 复制代码
import rclpy
from rclpy.node import Node

def main():
    rclpy.init()
    node = Node("python_node")
    node.get_logger().info('hello')
    rclpy.spin(node)
    rclpy.shutdown()

注意上述代码中去除了调用主函数的代码

功能包中调用主函数的方式是:告诉功能包main函数的位置,也就是接下来这步

③ 注册python节点

注册位置:demo_python_pkg/setup.py

此处的setup.py是python中常用的构建配置文件

注册内容:

注意注册时最后的逗号!

④ 添加依赖声明

由于代码中使用了rclpy库,所以需要在ROS2功能包的清单文件"package.xml"下添加依赖信息

添加位置:demo_python_pkg/package.xml

添加内容:<depend>rclpy</depend>

此处的package.xml为**元数据清单文件,**该文件对软件包的属性、状态及外部依赖关系进行了形式化定义。

⑤ 构建功能包

构建位置:该文件目录下的终端

输入命令:colcon build

Colcon:会在当前目录下扫描功能包,并创建与功能包同级的三个子目录

此时文件夹中会多出三个文件夹:

**Build:**构建过程中的中间文件

**Install:**构建结构的文件夹,该文件可以直接复制给别人使用,colcon build命令会在该文件夹中复制一个功能包demo_python_pkg,其中有python_node等可执行文件

**Log:**日志文件

⑥ 设置环境变量

位置:该文件目录下的终端

输入命令:source install/setup.bash

用来自动修改需要修改的环境变量,此环境变量只对当前终端有效,如果切换终端需要重新设置

⑦ 运行节点

位置:该文件目录下的终端

输入命令:ros2 run demo_python_pkg python_node

注意,此处运行的文件是install目录下的文件

相关推荐
雨季6663 小时前
构建 OpenHarmony 简易文字行数统计器:用字符串分割实现纯文本结构感知
开发语言·前端·javascript·flutter·ui·dart
雨季6663 小时前
Flutter 三端应用实战:OpenHarmony 简易倒序文本查看器开发指南
开发语言·javascript·flutter·ui
进击的小头4 小时前
行为型模式:策略模式的C语言实战指南
c语言·开发语言·策略模式
Aevget4 小时前
MFC扩展库BCGControlBar Pro v37.2新版亮点:控件功能进一步升级
c++·mfc·界面控件
天马37984 小时前
Canvas 倾斜矩形绘制波浪效果
开发语言·前端·javascript
Tansmjs4 小时前
C++与GPU计算(CUDA)
开发语言·c++·算法
喵手4 小时前
Python爬虫零基础入门【第九章:实战项目教学·第15节】搜索页采集:关键词队列 + 结果去重 + 反爬友好策略!
爬虫·python·爬虫实战·python爬虫工程化实战·零基础python爬虫教学·搜索页采集·关键词队列
qx094 小时前
esm模块与commonjs模块相互调用的方法
开发语言·前端·javascript
Suchadar4 小时前
if判断语句——Python
开发语言·python
ʚB҉L҉A҉C҉K҉.҉基҉德҉^҉大4 小时前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python