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

Python中使用SimpleActionServer()构建基本的动作服务

发布时间:2023-12-19 05:14:19

在Python中,可以使用SimpleActionServer()类来构建基本的动作服务,它是ROS(Robot Operating System)中提供的一种用于处理动作(Action)的通信机制。SimpleActionServer()类实现了一个简单的动作服务器,可以用于接收客户端的请求并执行相应的动作。

下面是一个使用SimpleActionServer()构建基本动作服务的例子:

#!/usr/bin/env python
import rospy
import actionlib
from my_package.msg import MyAction, MyResult, MyFeedback

class MyActionServer(object):
    # 初始化动作服务器
    def __init__(self):
        # 创建动作服务器
        self._as = actionlib.SimpleActionServer("my_action", MyAction, self.execute, False)
        # 设置回调函数
        self._as.register_preempt_callback(self.preempt_callback)
        # 初始化动作结果和反馈
        self._result = MyResult()
        self._feedback = MyFeedback()

    # 执行动作的回调函数
    def execute(self, goal):
        # 检查动作是否被中止
        if self._as.is_preempt_requested():
            rospy.loginfo("Action preempted")
            self._as.set_preempted(self._result)
            return
        
        # 执行动作并发送反馈信息
        rate = rospy.Rate(1)  # 1Hz
        for i in range(1, goal.count + 1):
            if self._as.is_preempt_requested():
                rospy.loginfo("Action preempted")
                self._as.set_preempted(self._result)
                return

            # 更新反馈信息
            self._feedback.progress = i
            self._as.publish_feedback(self._feedback)

            rate.sleep()

        # 动作执行完成后发送结果
        self._as.set_succeeded(self._result)

    # 中止动作的回调函数
    def preempt_callback(self):
        self._result.result = "preempted"
        self._as.set_preempted(self._result)

if __name__ == "__main__":
    # 初始化ROS节点
    rospy.init_node("my_action_server")
    
    # 创建动作服务器对象
    server = MyActionServer()
    
    # 启动动作服务器
    server._as.start()
    
    # 循环等待动作请求
    rospy.spin()

上述代码中,首先导入了必要的ROS和actionlib库,并定义了一个名为MyActionServer的类。在MyActionServer类的构造函数中进行了必要的初始化操作,如创建动作服务器、设置回调函数以及初始化动作结果和反馈。

execute函数为动作执行的回调函数,在该函数中首先检查动作是否被中止,如果是,则设置动作为中止状态,并返回。否则,依据动作请求的count参数来执行相应的动作,通过发布反馈信息来告知客户端当前的执行进度。在每次循环中,都检查动作是否被中止,如果是,则设置动作为中止状态,并返回。

preempt_callback函数为动作中止的回调函数,在该函数中设置动作的结果为"preempted",并将动作设置为中止状态。

if __name__ == "__main__"中,首先初始化ROS节点,然后创建MyActionServer对象,并启动动作服务器。最后,通过rospy.spin()来等待动作请求的到达。

在使用这个例子时,需要将其保存到一个ROS package的Python脚本中,并创建相应的消息文件my_package.msg来定义动作消息的格式。

以上就是使用SimpleActionServer()构建基本动作服务的一个例子。通过使用SimpleActionServer(),可以方便地创建动作服务器,并且可以实现对动作的执行、中止和结果反馈等操作。