在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的旅程中顺利愉快!
















