Python中actionlibSimpleActionServer()的使用案例
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通信机制,以便更好地理解其用法和原理。
