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

Python中使用SimpleActionServer()实现简单的服务器端操作

发布时间:2024-01-18 05:39:08

SimpleActionServer是ROS中用于实现服务器端操作的Python类。使用SimpleActionServer可以轻松地编写一个可以提供服务的ROS节点。

下面是一个使用SimpleActionServer实现一个简单的服务器端操作的示例:

# 引入必要的包
import rospy
import actionlib
from my_package.msg import MyAction, MyActionFeedback, MyActionResult

# 定义服务器端操作的回调函数
def do_action(goal):
    # 获取客户端发送的目标值
    target_value = goal.target

    # 创建一个用于发送反馈信息的对象
    feedback = MyActionFeedback()

    # 执行操作
    current_value = 0
    while current_value < target_value:
        # 检查服务器是否被要求取消操作
        if server.is_preempt_requested():
            # 服务器被取消,设置执行结果为被取消
            server.set_preempted()
            rospy.loginfo('Action preempted')
            return

        # 更新当前的值
        current_value += 1
        
        # 设置反馈信息的值
        feedback.current_value = current_value

        # 发送反馈信息给客户端
        server.publish_feedback(feedback)
        
        # 模拟操作的延迟
        rospy.sleep(1)

    # 执行完成后,设置执行结果为成功
    result = MyActionResult()
    result.final_value = current_value
    server.set_succeeded(result)
    rospy.loginfo('Action completed successfully')

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

    # 创建一个SimpleActionServer对象
    server = actionlib.SimpleActionServer('my_action', MyAction, do_action, False)

    # 启动服务器
    server.start()
    rospy.loginfo('Action server started')

    # 等待服务器关闭
    rospy.spin()

在上面的例子中,我们定义了一个名为my_action的Topic,用于实现服务器端操作。当客户端向该Topic发送一个action类型的消息时,服务器会执行do_action函数来完成操作。

在do_action函数中,我们首先获取客户端发送的目标值,并创建一个用于发送反馈信息的对象feedback。然后,在一个循环中逐步完成操作,并检查服务器是否被要求取消操作。如果是,我们设置执行结果为被取消,并返回。

操作完成后,我们设置执行结果为成功,并发送结果给客户端。在发送反馈信息的过程中,我们使用server.publish_feedback函数。

在代码的最后,我们初始化ROS节点,创建一个SimpleActionServer对象,并启动服务器。最后,我们调用rospy.spin()来等待服务器关闭。

以上是使用SimpleActionServer实现一个简单的服务器端操作的Python例子。你可以根据自己的需求修改和扩展这个例子。