Python中actionlibSimpleActionServer()的高级应用
发布时间:2023-12-16 06:12:13
actionlib是ROS中用于实现机器人行为的一种机制。actionlib定义了一种用于异步执行长期任务的通信接口,它使用一个中间人来处理请求和提供反馈。
actionlibSimpleActionServer()是actionlib库中的一个类,用于实现一个简单的行为服务器。它可以接收来自行为客户端的目标请求,并在任务完成或被取消时给出结果。
下面是一个使用actionlibSimpleActionServer()的简单示例,它实现了一个模拟的长期任务,即延时某段时间后给出结果:
import rospy
import actionlib
from actionlib_msgs.msg import *
from std_msgs.msg import *
from my_package.msg import *
# 定义行为服务器回调函数
def execute_cb(goal):
# 获取目标参数
duration = goal.duration
# 初始化行为服务器
server = actionlib.SimpleActionServer('my_action', MyAction, execute_cb, False)
server.start()
# 执行长期任务
rospy.loginfo("Executing action for %f seconds..." % duration)
rospy.sleep(duration)
# 判断任务是否被取消
if server.is_preempt_requested():
rospy.loginfo("Action preempted")
server.set_preempted()
else:
# 发送任务结果
result = MyResult()
result.position = duration * 10 # 假设任务结果为延时时间的10倍
server.set_succeeded(result)
if __name__ == '__main__':
# 初始化ROS节点
rospy.init_node('my_action_server')
# 创建行为服务器
server = actionlib.SimpleActionServer('my_action', MyAction, execute_cb, False)
# 启动行为服务器
server.start()
# 循环运行
rospy.spin()
在这个例子中,我们首先引入了需要的ROS包和消息类型。然后定义了一个行为服务器回调函数execute_cb(),它接收一个目标参数,并执行一个模拟的长期任务。任务完成后,我们使用server.set_succeeded()方法发送任务结果。
然后,在主函数中,我们初始化了ROS节点,并使用actionlib.SimpleActionServer()创建了一个行为服务器。最后,我们通过调用server.start()启动了行为服务器,并使用rospy.spin()进入一个循环运行状态,等待目标请求。
这是一个简单的行为服务器的例子,你可以根据自己的需求和任务来修改和扩展代码。
