下面是将 talker_listener_demo 改写为 Python 版本的步骤和代码示例。本文默认使用 ROS Noetic / Python 3;如果你使用的是 ROS Melodic 或更早版本,Python 解释器和生成路径可能不同。

步骤 1:创建 ROS 包

在终端中执行以下命令:

1
catkin_create_pkg talker_listener_demo rospy std_msgs

这将在 Catkin 工作空间中创建一个名为 talker_listener_demo 的 ROS 包,并将 rospystd_msgs 添加为依赖项。

步骤 2:创建 Python 脚本

Python 可执行节点通常放在包内的 scripts 目录下:

1
2
3
4
5
cd ~/catkin_ws/src/talker_listener_demo
mkdir -p scripts
cd scripts
touch talker.py
touch listener.py

步骤 3:编写 Python 节点代码

编辑 talker.pylistener.py 文件,编写发布者节点和订阅者节点的 Python 代码。

talker.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env python3

import rospy
from std_msgs.msg import String

def talker():
rospy.init_node('talker', anonymous=True)
pub = rospy.Publisher('chatter', String, queue_size=10)
rate = rospy.Rate(1) # 1 Hz
while not rospy.is_shutdown():
hello_str = "hello world %s" % rospy.get_time()
rospy.loginfo(hello_str)
pub.publish(hello_str)
rate.sleep()

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

listener.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env python3

import rospy
from std_msgs.msg import String

def callback(data):
rospy.loginfo("I heard %s", data.data)

def listener():
rospy.init_node('listener', anonymous=True)
rospy.Subscriber('chatter', String, callback)
rospy.spin()

if __name__ == '__main__':
listener()

步骤 4:添加依赖项到package.xml(正常应该不需要修改)

talker_listener_demo 包的 package.xml 文件中添加以下内容:

1
2
<depend>rospy</depend>
<depend>std_msgs</depend>

步骤 5:更新CMakeLists.txt

talker_listener_demo 包的 CMakeLists.txt 文件中确保 rospystd_msgs 被正确声明为依赖项。

1
2
3
4
5
6
7
8
find_package(catkin REQUIRED COMPONENTS
rospy
std_msgs
)

catkin_package(
CATKIN_DEPENDS rospy std_msgs
)

编译和运行

在 Catkin 工作空间中执行以下命令来编译 ROS 包:

1
2
cd ~/catkin_ws
catkin_make

也可以只编译指定包:

1
catkin_make --only-pkg-with-deps talker_listener_demo

然后,在两个不同的终端中分别运行发布者节点和订阅者节点:
执行前需要 source 一下:

1
source ~/catkin_ws/devel/setup.bash

同时给 Python 脚本添加执行权限:

1
2
chmod +x ~/catkin_ws/src/talker_listener_demo/scripts/talker.py
chmod +x ~/catkin_ws/src/talker_listener_demo/scripts/listener.py

可以用下面命令查看包是否存在

1
rospack list|grep talker_listener_demo

如果运行时提示找不到解释器,优先检查脚本第一行是否是 #!/usr/bin/env python3,不要为了单个 ROS 脚本修改 /usr/bin/python 的系统链接。

1
2
3
4
5
6
7
8
# 首先需要启动Master
roscore

# Terminal 1: Run the talker node
rosrun talker_listener_demo talker.py

# Terminal 2: Run the listener node
rosrun talker_listener_demo listener.py

现在,你应该能够在终端中看到发布者节点发布的消息被订阅者节点成功接收并打印出来了。