使用Python的ROS发布者

2025年4月11日 | 阅读 7 分钟

机器人操作系统 (ROS) 简介

在 ROS(机器人操作系统)中,发布者(publisher)允许节点向特定主题发送消息,其他节点可以订阅这些消息。使用 Python,发布者通过 `rospy` 库创建。ROS 发布者定义了主题、消息类型和发布频率。节点通过 `rospy.init_node()` 初始化,然后使用 `rospy.Publisher()` 函数来声明主题、消息类型(如 `std_msgs/String`)和队列大小。在循环中,使用 `pub.publish()` 发送消息,`rospy.Rate()` 管理消息发布频率。这使得机器人或系统能够通过主题实时共享数据,构成了不同 ROS 节点之间通信的基础。

除了基本设置,ROS 发布者还可以处理各种消息类型,如整数、浮点数或 ROS 生态系统中定义的自定义消息格式。关键在于确保发布者和订阅者都同意消息类型和主题。发布者还可以检查 ROS 主节点的状态,确保节点仍然处于活动状态并能正常管理通信。在大型系统中,多个发布者可以同时工作,广播不同类型的数据,例如传感器读数或控制命令。ROS 高效地处理协调,使得分布式系统更容易通信,而无需管理底层网络细节。

在 Python 中实现 ROS 发布者的步骤

步骤 1:设置 ROS 环境

要设置 ROS 环境,首先确保您的系统已安装 ROS。如果没有,请按照您所使用的 ROS 发行版(例如 ROS Noetic)的安装说明进行操作。安装完成后,在终端中 source(加载)设置脚本以配置环境。

将 `` 替换为您具体的 ROS 版本(例如 `noetic`)。此步骤允许您访问 ROS 命令和库,包括用于 Python ROS 节点的 `rospy` 库。

步骤 2:创建 Python 脚本

转到您的 ROS 包的 `scripts` 目录,为 ROS 发布者编写一个 Python 脚本。首先,如果还没有包,请创建一个新包。在文本编辑器中创建一个新的 Python 文件,通常命名为 `publisher.py`,并使其可执行。脚本将包含设置发布者、设置 ROS 节点以及实现一个 循环 将消息发布到特定主题所需的代码。编写时请务必遵循 ROS 规范和 Python 语法。

步骤 3:导入必要的 ROS 模块

要为您的发布者脚本导入必要的 ROS 模块,请首先包含 `rospy` 库,它提供了 Python 中 ROS 的核心功能。此外,还要导入您打算使用的消息类型,例如 `std_msgs` 包中的 `String`。这允许您定义发布者将发送的消息格式。这些导入通常放在脚本的开头,以确保所有必需的组件都可用于您的实现。

步骤 4:初始化节点

要在 ROS 发布者脚本中初始化节点,请使用 `rospy.init_node()` 函数。此函数使用指定的名称设置节点,允许其在 ROS 网络内进行通信。可以添加 `anonymous=True` 参数,以确保节点的多个实例可以同时运行而不会发生名称冲突。此初始化必须在任何发布或订阅发生之前完成,因为它为您的 ROS 应用程序建立了必要的通信上下文。

步骤 5:创建发布者

使用 `rospy.Publisher()` 函数可在 ROS 脚本中构建发布者。此函数需要三个主要参数:主题名称(例如 `'chatter'`)、消息类型(例如 `std_msgs` 包中的 `String`)和队列大小(表示发送前可缓冲的最大消息数)。主题名称标识了发布的地点,而消息类型确保发布者和订阅者了解正在传输的数据的格式。此设置可实现 ROS 生态系统中的高效通信。

步骤 6:定义消息发布循环

要在 ROS 发布者脚本中定义消息发布循环,请使用一个 `while` 循环,该循环一直运行直到节点关闭。在循环内部,调用发布者对象的 `publish()` 方法将消息发送到指定的主题。使用 `rospy.Rate()` 设置所需的发布频率(例如 1 Hz)。这控制消息的发送频率,确保订阅者及时收到更新。包括一个 `rate.sleep()` 调用,以便在每次发送消息之间暂停指定的持续时间,从而实现与订阅者的有效通信。

步骤 7:运行和测试您的 ROS 发布者

要运行和测试您的 ROS 发布者,首先保存 Python 脚本,然后使用 `rosrun` 或启动文件执行节点。打开一个终端,导航到您的工作区,并确保 ROS 环境已 source。然后,您可以通过运行适用于您的包和脚本的相应命令来启动发布者。这将启动节点,您可以使用 `rostopic echo` 等 ROS 工具来监视数据流,从而验证消息是否已发布到正确的主题。

步骤 8:查看已发布的消息

要查看 ROS 节点发布的消息,请在终端中使用 ROS 工具 `rostopic`。此工具允许您监视发送到特定主题的消息。打开一个新的终端,确保您的 ROS 环境已 source,然后运行相应的命令来查看已发布的消息。这将实时显示正在广播的消息内容。以这种方式监视主题有助于确认您的发布者是否正常工作,并且消息是否已到达订阅者。

在 Python 中实现 ROS 发布者

现在我们将看以下示例,演示如何在 Python 中实现 ROS 发布者。

示例

输出

当您运行提供的 ROS 发布者脚本时,输出将是每秒以 1 条消息的速率将消息发布到 `chatter` 主题。发布的消息是“Hello ROS!”,它将在您使用 `rostopic echo /chatter` 监视该主题的终端中显示。

运行监视命令的示例输出

说明

在此 ROS 发布者脚本中,`rospy.init_node()` 方法用于初始化一个名为 `'simple_publisher_node'` 的 ROS 节点。之后,创建 `Publisher` 对象以与 `chatter` 主题进行通信。为了确定在发布前可以缓冲多少条消息,队列大小设置为 10。使用的消息类型是 `std_msgs` 包中的 `String`。

在 `while not rospy.is_shutdown()` 循环中,通过 `rospy.Rate(1)`,该脚本以每秒一条消息的速度持续将消息 `"Hello ROS!"` 发送到 `chatter` 主题。这确保了消息以稳定的间隔持续发布。每次发送消息时,都会使用 `rospy.loginfo()` 将其记录到终端,从而提供实时反馈以进行调试和监视。循环将继续执行,直到节点被手动停止,或者由于外部事件收到关机信号,从而在节点处于活动状态的情况下,确保 ROS 主题上的不间断消息广播。这种基本的发布者结构对于 ROS 系统中节点之间的通信至关重要,能够实现机器人框架中不同组件之间持续的数据交换。

结论

总之,在 Python 中构建 ROS 发布者的过程很简单,并且允许 ROS 网络节点之间进行有效通信。作为第一步,请确保您的 ROS 环境已正确配置并已 source。之后,您将在包的 `scripts` 目录中创建一个 Python 脚本。

发布者的核心组件包括使用 `rospy.init_node()` 初始化节点,使用 `rospy.Publisher()` 创建发布者,以及定义消息发布循环。发布者以受控的频率将消息发送到指定的主题,该频率由 `rospy.Rate()` 管理。

节点的操作和测试使用 `rosrun` 等 ROS 工具完成,并且可以通过 `rostopic echo` 监视已发布的消息。此过程允许在网络中可靠地广播消息,这在基于 ROS 的机器人应用中至关重要。

此外,我们还讨论了在单独的终端中查看已发布的消息,并通过实时反馈确认系统按预期工作,确保节点之间的顺畅运行。这使得 ROS 成为构建可扩展的分布式机器人系统的强大框架。