————👆👆👆其他章节点开专栏查看👆👆👆————
本节内容
1. 使用 Python 编写话题的发布与订阅实现,要求发布方以 30HZ(每秒 30 次)的频率发布 rgba 颜色消息,订阅方订阅消息并将消息内容打印输出。 要求: 话题名称:color 发布方输出:已发出的颜色消息 订阅方输出:收到的颜色消息为:r=0, g=255, b=3, a=1。🌟
2. 使用 Python 编写服务客户端,实现向 turtlesim 发送请求,在乌龟显示节点窗口上指定位置生成新的乌龟。🌟
3. 使用 Python 编写代码来修改 turtlesim 乌龟显示节点窗口的背景色,已知背景色是通过参数服务器的方式设置的。🌟
实验步骤
1.发布 ColorRGBA 消息到 color 话题,订阅并打印颜色数据。
在ROS实验一的工作空间下继续实验。我们新建一个功能包,将其命名为task2,并添加以下依赖:
(创建功能包的方法在ROS实验一里有,可以在专栏中查看😊)
rospy std_msgs
和之前一样,在task2功能包中创建scripts文件夹。在scripts文件夹内添加color_publisher.py文件,用于发布话题。color_publisher.py的内容在这👇
#!/usr/bin/env python3
import rospy
from std_msgs.msg import ColorRGBA
def color_publisher():
# 初始化节点
rospy.init_node('color_publisher', anonymous=True)
# 创建发布者,话题名为 'color'
pub = rospy.Publisher('color', ColorRGBA, queue_size=10)
# 设置发布频率为30Hz
rate = rospy.Rate(30)
while not rospy.is_shutdown():
# 创建颜色消息
color_msg = ColorRGBA()
color_msg.r = 0
color_msg.g = 255
color_msg.b = 3
color_msg.a = 1
# 发布消息
pub.publish(color_msg)
rospy.loginfo("已发出的颜色消息")
rate.sleep()
if __name__ == '__main__':
try:
color_publisher()
except rospy.ROSInterruptException:
pass
添加color_subscriber.py文件,用于订阅话题。color_subscriber.py的内容在这👇
#!/usr/bin/env python3
import rospy
from std_msgs.msg import ColorRGBA
def color_callback(msg):
rospy.loginfo("收到的颜色消息为:r=%.0f, g=%.0f, b=%.0f, a=%.0f" % (msg.r, msg.g, msg.b, msg.a))
def color_subscriber():
# 初始化节点
rospy.init_node('color_subscriber', anonymous=True)
# 创建订阅者,话题名为 'color'
rospy.Subscriber('color', ColorRGBA, color_callback)
# 防止程序退出
rospy.spin()
if __name__ == '__main__':
try:
color_subscriber()
except rospy.ROSInterruptException:
pass
打开一个终端,运行roscore指令。打开第二个终端,依次运行以下指令:
#进入scripts文件夹,如果你的工作空间名和我不一样,换成你的名字
cd ~/catkin_ws/src/task2/scripts
#添加可执行权限
chmod +x color_publisher.py
chmod +x color_subscriber.py
cd ~/catkin_ws
catkin_make
source devel/setup.bash
rosrun task2 color_publisher.py #发布话题
打开第三个终端,运行以下指令:
#进入scripts文件夹,如果你的工作空间名和我不一样,换成你的名字
cd ~/catkin_ws/src/task2/scripts
#添加可执行权限
chmod +x color_publisher.py
chmod +x color_subscriber.py
cd ~/catkin_ws
catkin_make
source devel/setup.bash
rosrun task2 color_subscriber.py
最终运行结果如下😊😊
2.客户端请求 turtlesim 在指定位置生成新的乌龟
创建turtle_spawn_client.py文件,在文件中添加以下代码:
#!/usr/bin/env python3
import rospy
from turtlesim.srv import Spawn
def spawn_turtle(x, y, theta, name):
# 初始化节点
rospy.init_node('turtle_spawn_client')
# 等待服务的启动
rospy.wait_for_service('spawn')
try:
# 创建 spawn 服务代理
spawn_turtle_service = rospy.ServiceProxy('spawn', Spawn)
# 调用服务并传递参数:x, y, theta, name
spawn_turtle_service(x, y, theta, name)
rospy.loginfo("新乌龟已生成,位置:x=%.2f, y=%.2f, theta=%.2f, 名字:%s" % (x, y, theta, name))
except rospy.ServiceException as e:
rospy.logerr("服务调用失败:%s" % e)
if __name__ == '__main__':
try:
# 请求生成一个新乌龟,指定位置(例如 x=3.0, y=3.0, theta=0.0),并命名为 'turtle2'
spawn_turtle(3.0, 3.0, 0.0, 'turtle2')
except rospy.ROSInterruptException:
pass
完成后打开第一个终端运行roscore。打开第二个终端启动turtlesim。(和之前的操作一样,如果你的工作空间名字和我的不一样记得更改)
rosrun turtlesim turtlesim_node
打开第三个终端,输入以下命令。
#进入scripts文件夹,如果你的工作空间名和我不一样,换成你的名字
cd ~/catkin_ws/src/task2/scripts
#添加可执行权限
chmod +x turtle_spawn_client.py
cd ~/catkin_ws
catkin_make
source devel/setup.bash
rosrun task2 turtle_spawn_client.py
运行后在左下角生成了一只白色海龟😊😊
3.通过 参数服务器 修改 turtlesim 背景色。
修改背景色代码如下,我们将它命名为change_background_color.py。
#!/usr/bin/env python3
import rospy
def change_background_color(r, g, b):
# 初始化节点
rospy.init_node('change_background_color')
# 修改参数服务器上的背景色
rospy.set_param('/turtlesim/background_r', r)
rospy.set_param('/turtlesim/background_g', g)
rospy.set_param('/turtlesim/background_b', b)
rospy.loginfo("背景色已修改为:r=%d, g=%d, b=%d" % (r, g, b))
if __name__ == '__main__':
try:
# 修改背景色为红色
change_background_color(255, 0, 0)
except rospy.ROSInterruptException:
pass
完成后打开第一个终端运行roscore。打开第二个终端输入以下命令。(和之前的操作一样,如果你的工作空间名字和我的不一样记得更改)。
#进入scripts文件夹,如果你的工作空间名和我不一样,换成你的名字
cd ~/catkin_ws/src/task2/scripts
#添加可执行权限
chmod +x change_background_color.py
cd ~/catkin_ws
catkin_make
source devel/setup.bash
rosrun task2 change_background_color.py
打开第三个终端,启动小海龟。 (先运行py文件再启动小海龟)
rosrun turtlesim turtlesim_node
可以看到背景颜色变成了红色,恭喜你成功了!😊😊
评论前必须登录!
注册