欢迎访问宙启技术站
智能推送

Python中使用SimpleActionServer()搭建一个简单的服务器端

发布时间:2024-01-18 05:40:23

在Python中,可以使用SimpleActionServer()类来搭建一个简单的服务器端。SimpleActionServer()是ROS(机器人操作系统)中的一个类,用于实现action服务器端。

首先,需要安装并配置ROS。可以参考ROS官方网站(http://wiki.ros.org/)上的文档进行安装和配置。

接下来,可以使用以下代码搭建一个简单的服务器端,并提供一个例子来说明其使用。

import rospy
import actionlib
from std_msgs.msg import Empty
from my_msgs.msg import MyAction, MyActionFeedback, MyActionResult

# 回调函数,处理action请求
def do_action(goal):
    # 初始化反馈消息
    feedback = MyActionFeedback()
    # 初始化结果消息
    result = MyActionResult()

    # 根据goal执行相应的操作
    for i in range(1, goal.count + 1):
        # 模拟执行操作
        print("Performing action %d..." % i)
        rospy.sleep(1)  # 假设每个操作需要1秒钟的时间

        # 更新反馈消息
        feedback.current_count = i
        server.publish_feedback(feedback)
        
    # 设置操作完成结果
    result.final_count = goal.count
    server.set_succeeded(result)

if __name__ == "__main__":
    # 初始化节点
    rospy.init_node("action_server_node")

    # 创建action服务器端
    server = actionlib.SimpleActionServer("my_action", MyAction, do_action, False)
    # 开启服务器
    server.start()

    # 输出服务器开始的信息
    rospy.loginfo("Action server started")

    # 阻塞主线程,等待退出信号
    rospy.spin()

在上述示例中,我们创建了一个名为my_action的action服务器端。my_action是自定义的action类型,需要在my_msgs包中定义。

do_action()函数是处理action请求的回调函数。在这个例子中,我们仅仅为了演示目的,在服务器端执行了goal.count次操作,每个操作之间暂停1秒钟,然后更新反馈消息并发布。最后,我们设置了操作完成的结果。

运行上述代码后,服务器会开始处理来自客户端的action请求。可以使用以下代码创建一个简单的客户端,并向服务器发送请求。

import rospy
import actionlib
from my_msgs.msg import MyAction, MyGoal, MyResult

if __name__ == "__main__":
    # 初始化节点
    rospy.init_node("action_client_node")

    # 创建action客户端
    client = actionlib.SimpleActionClient("my_action", MyAction)
    # 等待服务器启动
    client.wait_for_server()

    # 创建并填充goal消息
    goal = MyGoal()
    goal.count = 5

    # 发送goal消息给服务器
    client.send_goal(goal)

    # 等待结果返回
    client.wait_for_result()

    # 输出结果
    result = client.get_result()
    rospy.loginfo("Final count: %d" % result.final_count)

在上述示例中,我们创建了一个名为my_action的action客户端,并向服务器发送了一个具有count属性为5的goal消息。然后,我们等待服务器返回结果,并输出结果中的final_count属性。

注意,在运行此代码之前,需要确保服务器端已经在运行,并且已经成功启动。

以上就是使用SimpleActionServer()搭建一个简单的服务器端的示例。通过使用这个类,我们可以方便地处理action请求并向客户端提供反馈和结果。