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

Python中使用actionlibSimpleActionServer()实现多个动作目标的处理

发布时间:2023-12-31 17:40:11

在Python中,可以使用actionlib.SimpleActionServer()实现多个动作目标的处理。SimpleActionServer()SimpleActionServer类的构造函数,它提供了一个简单的接口来处理动作目标。

以下是使用actionlib.SimpleActionServer()实现多个动作目标的处理的示例代码:

#!/usr/bin/env python
import rospy
import actionlib
from my_action_pkg.msg import MyAction, MyActionFeedback, MyActionResult

class MyActionServer(object):
    def __init__(self):
        # 初始化动作服务器
        self._as = actionlib.SimpleActionServer('my_action_server', MyAction, self.execute, False)
        self._as.start()

    def execute(self, goal):
        # 在这里处理动作目标
        feedback = MyActionFeedback()
        result = MyActionResult()

        # 执行动作目标
        for i in range(goal.count):
            rospy.sleep(1)  # 模拟动作的执行时间
            feedback.percent_complete = float(i + 1) / goal.count * 100
            self._as.publish_feedback(feedback)

            if self._as.is_preempt_requested():
                # 如果收到新的动作目标,则中断当前动作
                self._as.set_preempted()
                rospy.loginfo('Preempted')
                return

        # 判断动作是否成功完成
        if self._as.is_preempt_requested():
            # 因为在执行动作时收到了新的目标,所以动作未完成
            result.result = False
            rospy.loginfo('Not successful')
            self._as.set_preempted(result)
        else:
            # 动作成功完成
            result.result = True
            rospy.loginfo('Successful')
            self._as.set_succeeded(result)

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

在以上的例子中,首先导入了需要的库和消息类型。然后定义了一个MyActionServer类,在类的构造函数中初始化了动作服务器,并启动了服务器。execute方法是处理动作目标的核心逻辑,通过循环来执行动作的每一个步骤,并通过publish_feedback方法发布反馈信息。

如果在执行动作中收到了新的动作目标(即收到了中断请求),则通过set_preempted方法来中断当前动作,并在日志中打印中断信息。

最后,在动作完成时,通过set_succeeded方法将结果设置为成功,并在日志中打印成功信息。如果在执行动作时收到了新的动作目标,则将结果设置为未成功,并在日志中打印未成功信息。

main函数中,首先初始化ROS节点,然后创建了一个MyActionServer对象,最后进入了ROS的主循环中。

以上代码中的my_action_pkg是示例动作消息包的名称,你可以将其替换为你实际使用的动作消息包的名称。同时,还需要根据实际情况来自定义动作目标的处理逻辑。

参考资料:

- [ROS文档:actionlib](http://wiki.ros.org/actionlib)

- [ROS Wiki:SimpleActionServer](http://wiki.ros.org/actionlib_msgs/Tutorials/SimpleActionServer%28Python%29)