好的,下面是将 talker_listener_demo 从C++版本转换为Python版本的详细步骤和代码示例:

步骤 1:创建ROS包

在终端中执行以下命令:

1
catkin_create_pkg talker_listener_demo rospy std_msgs

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

步骤 2:创建Python脚本

src 文件夹下创建两个Python脚本:talker.pylistener.py

1
2
3
cd ~/catkin_ws/src/talker_listener_demo/src
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 python

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 python

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 talker.py
chmod +x listener.py

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

1
rospack list|grep talker_listener_demo

有时python命令不行,需要将python命令指向python3做符号链接

1
sudo ln -s /usr/bin/python3 /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

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