在Python中使用actionlibSimpleActionServer()轻松构建动作服务器
在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节点被关闭。
需要注意的是,上述代码中的MyAction和MyResult是自定义的消息类型,需要根据实际情况进行定义和导入。
使用这个动作服务器的客户端代码如下所示:
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()获取动作结果,并打印出来。
需要注意的是,上述代码中的MyAction和MyGoal是自定义的消息类型,需要根据实际情况进行定义和导入。
这就是使用actionlib.SimpleActionServer()轻松构建动作服务器的例子。动作服务器和动作客户端可以帮助我们实现复杂的异步操作,可以在机器人控制、行为规划、任务调度等领域发挥作用。
