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

实现Python中基本的动作服务器:actionlibSimpleActionServer()

发布时间:2023-12-31 17:39:02

actionlib是ROS中用于处理机器人动作的一个库,提供了简单易用的动作服务器和动作客户端。在Python中,可以使用SimpleActionServer类来实现一个基本的动作服务器。下面是一个例子来演示如何使用SimpleActionServer类。

import rospy
import actionlib
from your_package.msg import YourAction   # 替换成自己的动作消息类型

# 定义动作服务器的回调函数
def action_callback(goal):
    # 处理动作目标
    # 在这个例子中,我们只是简单地打印目标值
    print("Received goal:", goal)

    # 执行动作
    # 在这个例子中,我们只是模拟执行动作,等待5秒钟然后返回结果
    rospy.sleep(5)

    # 完成动作并返回结果
    result = YourActionResult()   # 替换成自己的动作结果类型
    result.result_value = 42
    server.set_succeeded(result)

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

    # 创建动作服务器
    server = actionlib.SimpleActionServer('your_action', YourAction, action_callback, auto_start=False)  # 替换成自己的动作消息类型
    server.start()

    rospy.spin()

在这个例子中,我们首先导入了必要的模块和消息类型。然后,我们定义了一个回调函数action_callback,它会被动作服务器调用来处理接收到的动作目标。

action_callback函数中,我们首先打印接收到的动作目标,然后模拟执行动作,这里只是等待了5秒钟。最后,我们创建一个动作结果,并使用set_succeeded()方法将结果发送给动作客户端。

__main__函数中,我们首先初始化了ROS节点。然后,我们创建了一个名为action_server的动作服务器,指定了动作名称、动作消息类型、回调函数、以及auto_start=False以便手动启动服务器。最后,我们调用了start()方法来启动动作服务器,并使用rospy.spin()来使节点保持运行,直到它被关闭。

要使用这个动作服务器,你需要在另一个节点中创建一个动作客户端并发送动作目标。你可以使用SimpleActionClient类来实现动作客户端。

import rospy
import actionlib
from your_package.msg import YourAction, YourActionGoal   # 替换成自己的动作消息类型

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

    # 创建动作客户端
    client = actionlib.SimpleActionClient('your_action', YourAction)  # 替换成自己的动作消息类型

    # 等待服务器
    client.wait_for_server()

    # 创建动作目标
    goal = YourActionGoal()   # 替换成自己的动作目标类型
    goal.goal_value = 10

    # 发送动作目标
    client.send_goal(goal)

    # 等待动作完成
    client.wait_for_result()

    # 获取结果
    result = client.get_result()
    print("Result:", result.result_value)

在这个例子中,我们首先导入了必要的模块和消息类型。然后,我们初始化了ROS节点。

接下来,我们创建了一个名为action_client的动作客户端,指定了动作名称和动作消息类型。

然后,我们调用wait_for_server()方法来等待动作服务器的启动。

接下来,我们创建了一个动作目标对象,并设置了目标值为10。

然后,我们使用send_goal()方法向动作服务器发送目标。

然后,我们调用wait_for_result()方法来等待动作完成。

最后,我们使用get_result()方法获取动作的结果,并打印到屏幕上。

以上是一个简单的动作服务器的实现和一个动作客户端的例子,可以用作参考开始自己的实现。注意要将代码中的your_packageYourActionYourActionGoalYourActionResult替换成自己的实际值。