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

使用SimpleActionServer()在Python中构建基本行为响应系统

发布时间:2023-12-19 05:15:08

在Python中,可以使用ROS的SimpleActionServer类来构建基本的行为响应系统。SimpleActionServer类是ROS的actionlib包中的一个重要类,用于实现行为(Action)服务器。

首先,需要确保计算机上已经安装了ROS和actionlib包。可以通过以下命令来安装:

sudo apt-get install ros-melodic-actionlib

下面是一个使用SimpleActionServer构建基本行为响应系统的示例:

import rospy
import actionlib
from my_robot_msgs.msg import MyAction, MyActionFeedback, MyActionResult

# 行为服务器回调函数
def execute_callback(goal):
    # 执行行为的逻辑
    result = MyActionResult()

    for i in range(1, goal.target_number + 1):
        # 发布行为进展状态
        feedback = MyActionFeedback()
        feedback.current_number = i
        server.publish_feedback(feedback)

        # 模拟执行行为的延迟
        rospy.sleep(1)

    if rospy.is_shutdown():
        result.result = 'preempted'  # 行为被中断
    else:
        result.result = 'succeeded'  # 行为执行成功

    # 发布最终结果
    server.set_succeeded(result)


rospy.init_node('my_action_server')

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

rospy.spin()

上述例子中,我们定义了一个名为my_action_server的ROS节点,并创建了一个名称为my_action的行为服务器。行为定义为MyAction,包含一个整数字段target_number

在行为服务器的回调函数execute_callback中,我们通过迭代的方式模拟了行为的执行过程。在每次迭代中,我们发布了行为的进度状态,并在每次迭代之间间隔了1秒钟,以模拟行为的延迟执行。如果在执行行为期间检测到ROS被关闭,则设置行为结果为'preempted',否则设置为'succeeded'。

最后,使用server.start()来启动行为服务器,rospy.spin()使节点保持活动状态,接收并处理行为请求。

为了测试行为服务器,可以创建一个行为客户端节点,使用以下代码:

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

rospy.init_node('my_action_client')

# 创建行为客户端
client = actionlib.SimpleActionClient('my_action', MyAction)
client.wait_for_server()

# 创建并发送行为请求
goal = MyGoal()
goal.target_number = 5
client.send_goal(goal)

# 等待行为结果
client.wait_for_result()
result = client.get_result()
print(result)

上述例子中,我们创建了一个名为my_action_client的ROS节点,并创建了一个名称为my_action的行为客户端。使用wait_for_server()等待行为服务器可用。然后,创建并发送行为请求,等待行动完成,并通过get_result()获取行动的结果。

综上所述,使用SimpleActionServer类可以在Python中构建基本的行为响应系统。行为服务器通过回调函数处理行为请求,并根据实际需求执行相应的逻辑,并提供进展状态和最终结果。行为客户端可以发送行为请求并等待行为完成,并获取行为的结果。