在ROS中使用Python自定义消息发布:入门指南

在机器人操作系统(ROS)中,自定义消息是用于节点之间通信的重要工具。对于刚入行的开发者,理解如何创建和发布自定义消息至关重要。本文将逐步引导你实现这一过程。

任务流程

我们将通过以下步骤实现自定义消息的发布。下面是整个流程的概要表格:

步骤 描述 时间估计
1 创建工作空间 1小时
2 创建自定义消息类型 1小时
3 编写发布节点的Python代码 1小时
4 编写订阅节点的Python代码 1小时
5 编译并运行代码 30分钟
6 测试与验证 30分钟

我们将依次详细说明每一个步骤。

步骤一:创建工作空间

首先,我们需要创建一个ROS工作空间。假设你已经安装了ROS(例如,ROS Noetic),可以按以下步骤进行:

# 创建工作空间目录
mkdir -p ~/ros_ws/src
cd ~/ros_ws/src

# 初始化工作空间
catkin_init_workspace

这里的代码完成了工作空间及其源代码目录的创建。catkin_init_workspace命令用于初始化该目录为工作空间。

步骤二:创建自定义消息类型

在源代码目录中,我们将创建一个新的包,这个包将用于定义自定义消息。

# 创建一个新的ROS包,包含自定义消息
cd ~/ros_ws/src
catkin_create_pkg my_custom_msgs std_msgs rospy

# 创建消息目录
mkdir -p my_custom_msgs/msg

接下来,我们在my_custom_msgs/msg目录下创建一个消息文件,例如MyMessage.msg

# 打开MyMessage.msg文件进行编辑
nano my_custom_msgs/msg/MyMessage.msg

在这个文件中,一些自定义的消息内容如下:

float32 data
string message

以上内容定义了一个包含浮点数和字符串的消息结构。

步骤三:编写发布节点的Python代码

接下来,我们需要创建一个发布节点。首先,确保你在my_custom_msgs包下工作。

# 创建一个scripts目录
mkdir -p my_custom_msgs/scripts
chmod +x my_custom_msgs/scripts

# 创建发布节点的文件
touch my_custom_msgs/scripts/publisher.py

编辑publisher.py文件:

#!/usr/bin/env python
import rospy
from my_custom_msgs.msg import MyMessage

def publisher():
    # 初始化节点
    rospy.init_node('my_publisher', anonymous=True)
    publisher = rospy.Publisher('my_topic', MyMessage, queue_size=10)

    rate = rospy.Rate(1)  # 1 Hz
    msg = MyMessage()
    while not rospy.is_shutdown():
        msg.data = 42.0
        msg.message = "Hello, ROS!"
        publisher.publish(msg)  # 发布消息
        rospy.loginfo("Published: %s", msg)
        rate.sleep()

if __name__ == '__main__':
    try:
        publisher()
    except rospy.ROSInterruptException:
        pass

这里的代码实现了一个简单的ROS节点,每秒发布一次自定义消息。

步骤四:编写订阅节点的Python代码

类似地,我们创建一个订阅节点来接收这些消息。

# 创建订阅节点的文件
touch my_custom_msgs/scripts/subscriber.py

编辑subscriber.py文件:

#!/usr/bin/env python
import rospy
from my_custom_msgs.msg import MyMessage

def callback(msg):
    rospy.loginfo("Received: data=%f, message=%s", msg.data, msg.message)

def subscriber():
    rospy.init_node('my_subscriber', anonymous=True)
    rospy.Subscriber('my_topic', MyMessage, callback)

    rospy.spin()  # 保持节点运行

if __name__ == '__main__':
    try:
        subscriber()
    except rospy.ROSInterruptException:
        pass

此代码定义了一个订阅节点,接收并打印来自my_topic的话题的消息。

步骤五:编译并运行代码

在工作空间的根目录下,我们需要编译我们的包:

# 回到工作空间根目录
cd ~/ros_ws
catkin_make

完成编译后,可以启动ROS核心服务:

roscore

打开两个新终端,分别运行发布节点和订阅节点:

# 在终端1
rosrun my_custom_msgs publisher.py

# 在终端2
rosrun my_custom_msgs subscriber.py

你将看到发布的消息和接收的消息在终端中交互。

步骤六:测试与验证

使用rqt_graph工具来可视化你的节点连接:

rosrun rqt_graph rqt_graph

项目进度甘特图

下面是项目的进度甘特图,帮助你跟踪每个步骤的进度。

gantt
    title ROS自定义消息发布项目
    dateFormat  YYYY-MM-DD
    section 步骤
    创建工作空间          :a1, 2023-01-01, 1d
    创建自定义消息类型    :a2, after a1, 1d
    编写发布节点的Python代码  :a3, after a2, 1d
    编写订阅节点的Python代码  :a4, after a3, 1d
    编译并运行代码         :a5, after a4, 1d
    测试与验证            :a6, after a5, 0.5d

结尾

通过本文的步骤,你应该能够成功创建、编译并运行自定义消息的发布与订阅节点。这不仅是ROS开发的基本要求,同时也是你迈向更复杂应用的第一步。希望你能在接下来的学习中不断探索并扩展你的技能。

祝你在ROS的旅程中顺利愉快!