rospy 库基本用法

本文主要介绍如何使用 rospy 客户端库编写 ROS 节点,包括 ROS 节点中导入模块、初始化 ROS 节点,以及发布和订阅话题等基本用法。

模块导入

使用 Python 编程时,首先需要导入 rospy 模块,才能创建 ROS 节点。

import rospy

rospy 模块包含了所有重要的 ROS 功能。另一个常用的模块是 msg 消息类型模块,下面是在 Python 中导入字符串消息类型的代码:

from std_msgs.msg import String

如果你想了解 std_msgs 软件包的完整消息类型列表,可以点击这里查看。

初始化 ROS 节点

在编写任何 ROS 节点功能之前,首先要做的就是初始化节点。

在 Python 中,使用下面代码即可完成初始化:

rospy.init_node('name_of_node', anonymous = True)

第一个参数是 ROS 节点的名称,第二个参数 anonymous=True 意味着可以在系统中同时运行该节点的多个实例。初始化后可通过 rosnod list 命令查看 ROS 节点信息。

在 ROS 节点中打印信息

ROS 提供了记录日志信息的应用程序接口。这些信息是一些可读字符串,代表了节点的运行状态。

在 Python 中,以下函数可以用于记录节点信息:

rospy.loginfo(msg, *args)    # 记录节点输出的基本信息 */
rospy.logwarn(msg, *args)    # 记录节点输出的警告信息 */
rospy.logdebug(msg, *args)   # 记录节点输出的调试信息 */
rospy.logerr(msg, *args)     # 记录节点输出的错误信息 */
rospy.logfatal(msg, *args)   # 记录节点输出的致命信息 */

使用示例:

rospy.logerr("%s returned the invalid value %s", other_name, other_value)

创建节点句柄

在 Python 中,不需要像 C++ 那样创建节点句柄,因为 rospy 模块在内部已经自动解决了这个问题。

创建 ROS 消息定义

在 Python 中,创建 ROS 消息很简单。例如,我们可以使用下面代码向字符串中添加数据:

msg = String()
msg.data = "string data"

在 ROS 节点中发布话题

在 Python 中,发布话题的语法如下:

publisher_obj = rospy.Publisher('topic_name', message_type, queue_size)

使用示例:

pub = rospy.Publisher('chatter', String, queue_size = 10)
pub.publish(hello_str)

该示例发布了一个名为 chatter 的话题,消息类型为 std_msgs/String,队列大小为 10。

在 ROS 节点中订阅话题

与发布话题相对应的是订阅话题,在 Python 中订阅话题的语法如下:

rospy.Subscriber("topic_name", message_type, callback_function)

回调函数是用户自定义的函数,一旦节点从该话题接收到 ROS 消息,回调函数就会被执行,从而可以及时处理 ROS 消息。

例如,假设有一个 “chatter” 话题的回调函数 chatterCallback(),那么可以这样订阅话题:

rospy.Subscriber("chatter", String, chatterCallback)

在 ROS 节点中编写回调函数

当订阅 ROS 话题并且有消息到达话题时,回调函数就被触发。下面是一个 Python 处理回调函数的示例:

def chatterCallback(data):
    rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)

ROS 节点中的 spin 函数

Python 中没有 spin() 函数,但是却可以在发布话题后使用 rospy.sleep() 函数。如果只订阅话题,那么可以使用 rospy.spin() 函数。

ROS 节点中的 sleep 函数

如果想为节点中的循环设置一个恒定的速率,那么可以用 rospy.Rate() 函数。我们可以先创建一个 rospy.Rate 实例,并在该实例中指定我们想要的速率,然后调用实例的 sleep() 函数来使其生效。

使用示例:

rate = rospy.Rate(10)  # 10Hz
rate.sleep()

设置和获取 ROS 参数

在 Python 中,我们使用 rospy.get_paramrospy.set_param 来获取或设置 ROS 参数。例如:

global_name = rospy.get_param("/global_name")  # 获取参数
rospy.set_param('private_int', '2')            # 设置参数

更多示例