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

Python中actionlibSimpleActionServer()的高级应用

发布时间:2023-12-16 06:12:13

actionlib是ROS中用于实现机器人行为的一种机制。actionlib定义了一种用于异步执行长期任务的通信接口,它使用一个中间人来处理请求和提供反馈。

actionlibSimpleActionServer()是actionlib库中的一个类,用于实现一个简单的行为服务器。它可以接收来自行为客户端的目标请求,并在任务完成或被取消时给出结果。

下面是一个使用actionlibSimpleActionServer()的简单示例,它实现了一个模拟的长期任务,即延时某段时间后给出结果:

import rospy
import actionlib
from actionlib_msgs.msg import *
from std_msgs.msg import *
from my_package.msg import *

# 定义行为服务器回调函数
def execute_cb(goal):
    # 获取目标参数
    duration = goal.duration

    # 初始化行为服务器
    server = actionlib.SimpleActionServer('my_action', MyAction, execute_cb, False)
    server.start()

    # 执行长期任务
    rospy.loginfo("Executing action for %f seconds..." % duration)
    rospy.sleep(duration)

    # 判断任务是否被取消
    if server.is_preempt_requested():
        rospy.loginfo("Action preempted")
        server.set_preempted()
    else:
        # 发送任务结果
        result = MyResult()
        result.position = duration * 10  # 假设任务结果为延时时间的10倍
        server.set_succeeded(result)

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

    # 创建行为服务器
    server = actionlib.SimpleActionServer('my_action', MyAction, execute_cb, False)

    # 启动行为服务器
    server.start()

    # 循环运行
    rospy.spin()

在这个例子中,我们首先引入了需要的ROS包和消息类型。然后定义了一个行为服务器回调函数execute_cb(),它接收一个目标参数,并执行一个模拟的长期任务。任务完成后,我们使用server.set_succeeded()方法发送任务结果。

然后,在主函数中,我们初始化了ROS节点,并使用actionlib.SimpleActionServer()创建了一个行为服务器。最后,我们通过调用server.start()启动了行为服务器,并使用rospy.spin()进入一个循环运行状态,等待目标请求。

这是一个简单的行为服务器的例子,你可以根据自己的需求和任务来修改和扩展代码。