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

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

发布时间:2023-12-19 05:13:37

在Python中,可以使用python_actionlib库中的SimpleActionServer()来构建基本的动作服务器。SimpleActionServer提供了一个用于处理动作请求和发送动作反馈的简单接口。

下面是一个使用SimpleActionServer()构建动作服务器的简单示例:

import rospy
import actionlib
from my_robot_msgs.msg import DoSomethingAction, DoSomethingFeedback, DoSomethingResult

# 定义动作服务器类
class DoSomethingServer:
    def __init__(self):
        # 初始化动作服务器
        self.server = actionlib.SimpleActionServer('do_something', DoSomethingAction, self.execute, False)
        self.server.start()
        rospy.loginfo("Action Server started")

    def execute(self, goal):
        # 获取动作目标
        target_value = goal.target_value

        # 创建动作反馈对象
        feedback = DoSomethingFeedback()

        # 执行动作操作
        for i in range(target_value):
            # 更新动作反馈信息
            feedback.progress = i+1
            self.server.publish_feedback(feedback)

            # 模拟运行时间
            rospy.sleep(1)

        # 创建动作结果对象
        result = DoSomethingResult()

        # 设置动作结果
        result.final_value = target_value

        # 发送动作结果
        self.server.set_succeeded(result)
        rospy.loginfo("Action completed successfully")

if __name__ == '__main__':
    # 初始化ROS节点
    rospy.init_node('do_something_server')

    # 创建动作服务器对象
    server = DoSomethingServer()

    # 循环等待
    rospy.spin()

上面的示例中,定义了一个名为DoSomethingServer的动作服务器类。该类初始化了一个名为do_something的动作服务器,接受类型为DoSomethingAction的动作请求,并在执行动作时发布动作反馈和最后的动作结果。

在execute方法中,首先获取动作目标的值,然后创建DoSomethingFeedback对象来发布动作反馈。接着通过for循环模拟执行动作的操作,并在每次循环中更新动作反馈信息。执行完动作后,创建DoSomethingResult对象来设置最终的动作结果,并使用set_succeeded方法发送动作结果。

最后,在主程序中初始化ROS节点和创建DoSomethingServer对象,通过spin()方法来循环等待动作请求。

要运行上述示例,首先需要创建一个名为DoSomethingAction的动作文件,包含两个字段:target_value和final_value。然后,还需要将动作文件的消息类型添加到my_robot_msgs包中,并确保其它相关依赖项已正确安装。

运行示例后,可以使用rostopic命令来查看动作服务器发布的动作反馈和结果:

rostopic echo /do_something_server/feedback
rostopic echo /do_something_server/result

总结来说,通过使用SimpleActionServer(),我们可以轻松构建基本的动作服务器,并处理动作请求、发送动作反馈和最终结果。这样可以方便地与其他节点进行通信和协调任务。