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

Python中actionlibSimpleActionServer()的使用案例

发布时间:2023-12-16 06:09:05

actionlibSimpleActionServer()是ROS中用于创建一个简单的Action服务的类。它允许你定义一个Action类型,并为该类型注册一个回调函数,当接收到Action请求时,会调用该回调函数来处理请求。

下面是一个使用actionlibSimpleActionServer的简单示例:

#!/usr/bin/env python
import rospy
import actionlib
from actionlib.msg import TestAction, TestResult, TestFeedback

# 定义回调函数,用于处理Action请求
def action_callback(goal):
    # 创建一个Action结果对象
    result = TestResult()
    # 创建一个Action反馈对象
    feedback = TestFeedback()

    # 设置反馈对象的一些属性
    feedback.feedback = "Action is in progress..."

    # 发布反馈消息
    server.publish_feedback(feedback)

    # 处理Action请求,这里简单地将goal乘以2作为结果
    result.result = goal.goal * 2

    # 发布结果消息
    server.set_succeeded(result, "Action is completed successfully")

    # 如果要中断Action,可以调用server.set_aborted(result, "Action is aborted")

if __name__ == '__main__':
    # 初始化ROS节点
    rospy.init_node('simple_action_server')

    # 创建一个Action服务器,指定Action类型为TestAction,回调函数为action_callback
    server = actionlib.SimpleActionServer('test_action', TestAction, action_callback, False)

    # 开始运行Action服务器
    server.start()

    # 进入ROS循环,等待Action请求
    rospy.spin()

在这个例子中,我们首先导入了必要的模块,并定义了一个用于处理Action请求的回调函数action_callback。在回调函数中,我们首先创建了一个Action结果对象和一个Action反馈对象。

接着,我们设置了反馈对象的属性,并发布了反馈消息。然后,我们处理了Action请求,将传入的goal乘以2作为结果,设置到结果对象中。

最后,我们通过调用server.set_succeeded(result, "Action is completed successfully")来发布完成的结果消息。

main函数中,我们首先初始化了ROS节点,并创建了一个Action服务器,指定了Action的类型为TestAction,回调函数为action_callback

最后,我们调用server.start()来开始运行Action服务器,并使用rospy.spin()进入ROS循环,等待Action请求的到来。

可以通过发布一个Action请求来测试这个Action服务器,下面是一个简单的Action客户端的示例:

#!/usr/bin/env python
import rospy
import actionlib
from actionlib.msg import TestAction, TestGoal

if __name__ == '__main__':
    # 初始化ROS节点
    rospy.init_node('simple_action_client')

    # 创建一个Action客户端,指定Action类型为TestAction
    client = actionlib.SimpleActionClient('test_action', TestAction)

    # 等待Action服务器可用
    client.wait_for_server()

    # 创建一个Action目标对象,指定目标值为10
    goal = TestGoal()
    goal.goal = 10

    # 发送Action请求
    client.send_goal(goal)

    # 等待Action完成
    client.wait_for_result()

    # 输出Action的结果
    print("Result:", client.get_result().result)

在这个例子中,我们首先初始化了ROS节点,并创建了一个Action客户端,指定了Action的类型为TestAction

然后,我们使用client.wait_for_server()来等待Action服务器的可用性。接着,我们创建了一个Action目标对象,指定目标值为10,并调用client.send_goal(goal)发送Action请求。

最后,我们使用client.wait_for_result()等待Action完成,并使用client.get_result().result获取Action的结果,并输出。

运行这两个脚本,你会看到Action服务器会处理来自Action客户端的请求,并返回结果。

这是一个简单的使用actionlibSimpleActionServer的例子,实际应用中可以根据具体需求进行扩展和优化。当然,使用actionlibSimpleActionServer也需要了解ROS中的Action通信机制,以便更好地理解其用法和原理。