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

在Python中使用actionlibSimpleActionServer()轻松构建动作服务器

发布时间:2023-12-31 17:33:18

在Python中,可以使用actionlib.SimpleActionServer()来轻松构建动作服务器。动作服务器用于处理客户端发送的动作请求,并向客户端返回动作结果或状态。

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

import rospy
import actionlib
from my_package.msg import MyAction, MyGoal, MyResult

# 回调函数,用于处理动作请求
def action_callback(goal):
    # 打印客户端发送的目标值
    rospy.loginfo('Received goal: %s', goal.target)

    # 执行动作,并生成结果
    result = MyResult()
    result.message = 'Action completed successfully'

    # 向客户端发送结果
    server.set_succeeded(result)

# 初始化ROS节点
rospy.init_node('my_action_server')

# 创建动作服务器
server = actionlib.SimpleActionServer('my_action', MyAction, action_callback, False)
# 参数说明:'my_action'为服务器名称,MyAction为动作消息类型,action_callback为回调函数
# False表示禁用自动开始

# 启动动作服务器
server.start()

# 循环执行动作服务器,直到ROS节点被关闭
rospy.spin()

在上面的例子中,首先导入了必要的ROS包和消息类型。然后,定义了一个回调函数action_callback(),用于处理动作请求。在回调函数中,我们可以执行任意的动作,并生成结果。

在主程序中,首先初始化了ROS节点。然后,通过调用actionlib.SimpleActionServer()创建了一个动作服务器。这里指定了服务器的名称为my_action,动作消息类型为MyAction,回调函数为action_callback。最后,通过调用server.start()启动了动作服务器,并通过rospy.spin()进入了循环执行,直到ROS节点被关闭。

需要注意的是,上述代码中的MyActionMyResult是自定义的消息类型,需要根据实际情况进行定义和导入。

使用这个动作服务器的客户端代码如下所示:

import rospy
import actionlib
from my_package.msg import MyAction, MyGoal

# 初始化ROS节点
rospy.init_node('my_action_client')

# 创建动作客户端
client = actionlib.SimpleActionClient('my_action', MyAction)
# 参数说明:'my_action'为服务器名称,MyAction为动作消息类型

# 等待服务器启动
client.wait_for_server()

# 创建动作目标
goal = MyGoal()
goal.target = 42

# 发送动作目标并等待完成
client.send_goal(goal)
client.wait_for_result()

# 获取动作结果
result = client.get_result()

# 打印动作结果
rospy.loginfo('Action result: %s', result.message)

在上面的例子中,首先导入了必要的ROS包和消息类型。然后,初始化了ROS节点,并通过actionlib.SimpleActionClient()创建了一个动作客户端。

在主程序中,首先调用client.wait_for_server()等待动作服务器启动。然后,创建了一个动作目标goal,并将目标值设置为42

接下来,通过client.send_goal()发送动作目标,并通过client.wait_for_result()等待动作完成。最后,通过client.get_result()获取动作结果,并打印出来。

需要注意的是,上述代码中的MyActionMyGoal是自定义的消息类型,需要根据实际情况进行定义和导入。

这就是使用actionlib.SimpleActionServer()轻松构建动作服务器的例子。动作服务器和动作客户端可以帮助我们实现复杂的异步操作,可以在机器人控制、行为规划、任务调度等领域发挥作用。