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

Python中使用actionlibSimpleActionServer()实现动作目标超时处理

发布时间:2023-12-31 17:44:22

在Python中,要实现动作目标的超时处理,可以使用rospy.Actionlib库中的SimpleActionServer类。SimpleActionServer类是一个ROS动作服务器,用于接收和处理动作目标,并在给定的时间内发送响应。如果超过给定的时间,可以执行超时处理。

下面是一个使用SimpleActionServer类实现动作目标超时处理的示例:

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

class MyActionServer:
    def __init__(self):
        self.server = actionlib.SimpleActionServer('my_action', MyAction, self.execute_action, False)
        self.server.start()
        self.timeout_duration = rospy.Duration(5)  # 设置超时时长为5秒

        self.feedback = MyActionFeedback()
        self.result = MyActionResult()

        self.action_started = False
        self.timeout_timer = rospy.Timer(rospy.Duration(0.1), self.check_timeout)

    def execute_action(self, goal):
        # 执行动作
        self.action_started = True

        # 发送反馈
        self.feedback.status = 'Action in progress'
        self.server.publish_feedback(self.feedback)

        # 发送结果
        self.result.status = 'Action completed'
        self.server.set_succeeded(self.result)

    def check_timeout(self, event):
        if self.server.is_active() and not self.action_started:
            # 如果动作还未开始,并且超出设定的超时时间
            if rospy.Time.now() - self.server.start_time > self.timeout_duration:
                # 停止服务器,表示超时
                self.server.set_aborted()
                rospy.logwarn('Action timed out')

            # 发送超时反馈
            self.feedback.status = 'Action timed out'
            self.server.publish_feedback(self.feedback)


if __name__ == '__main__':
    rospy.init_node('my_action_server')
    action_server = MyActionServer()
    rospy.spin()

上面的示例首先导入需要的ROS和Actionlib库。创建了一个名为MyActionServer的类,该类继承了object类。在类的初始化方法__init__中,创建了一个SimpleActionServer对象,并指定了动作的名称、类型和回调函数。然后调用start()函数启动服务器。

在初始化方法中设置了超时时间为5秒,创建了反馈和结果的实例,并初始化了其他需要的变量。

execute_action函数是动作目标的执行函数。在这个函数中,首先表示动作已经开始,然后发送反馈消息,并设置动作目标为完成。最后,调用set_succeeded()函数设置动作的状态为成功。

check_timeout函数是一个定时器回调函数,用于检查动作是否超时。当服务器是活动状态,并且动作还未开始时,在超过设定的超时时间后,将停止服务器并发布超时反馈消息。

main函数中,首先初始化ROS节点,然后创建了MyActionServer对象,并调用spin()函数使节点保持运行状态。

这是一个简单的使用SimpleActionServer类实现动作目标超时处理的例子。当执行的动作在规定的超时时间内没有完成时,可以执行相应的超时处理操作。