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

Python中如何利用SimpleActionClient()监测动作执行状态

发布时间:2023-12-15 22:27:59

在Python中,可以使用SimpleActionClient()来监测动作执行的状态。SimpleActionClient()是ROS中的一个客户端类,用于向服务器发送动作请求并接收服务器的响应。

以下是一个使用SimpleActionClient()监测动作执行状态的例子:

#!/usr/bin/env python

import rospy
import actionlib
from my_robot_msgs.msg import MoveRobotAction, MoveRobotGoal

def action_done_callback(state, result):
    if state == actionlib.GoalStatus.SUCCEEDED:
        rospy.loginfo("Action completed successfully.")
    elif state == actionlib.GoalStatus.ABORTED:
        rospy.loginfo("Action aborted.")
    elif state == actionlib.GoalStatus.PREEMPTED:
        rospy.loginfo("Action preempted.")
    else:
        rospy.loginfo("Action terminated with unknown status.")

def action_feedback_callback(feedback):
    rospy.loginfo("Received action feedback: %s", feedback)

def main():
    rospy.init_node('action_client_node')

    # 创建一个 SimpleActionClient 实例
    client = actionlib.SimpleActionClient('move_robot', MoveRobotAction)

    # 等待服务器启动
    rospy.loginfo("Waiting for action server to start...")
    client.wait_for_server()

    # 创建动作目标
    goal = MoveRobotGoal()
    goal.distance = 10.0
    goal.speed = 5.0

    # 发送动作目标给服务器,并指定回调函数
    client.send_goal(goal, done_cb=action_done_callback, feedback_cb=action_feedback_callback)

    # 等待动作完成
    rospy.loginfo("Waiting for action to complete...")
    client.wait_for_result()

if __name__ == '__main__':
    main()

以上代码的解释如下:

1. 导入必要的模块和动作消息

2. 定义一个动作完成的回调函数action_done_callback(),根据动作状态打印相应的信息

3. 定义一个动作反馈的回调函数action_feedback_callback(),在接收到动作反馈时打印反馈信息

4. 主函数中,初始化ROS节点

5. 创建一个SimpleActionClient实例,指定动作类型为MoveRobotAction

6. 等待服务器启动,等待服务器准备好接收动作请求

7. 创建一个动作目标MoveRobotGoal,并设置目标的距离和速度

8. 使用send_goal()方法发送动作目标给服务器,并指定回调函数

9. 等待动作完成,调用wait_for_result()阻塞程序直到动作完成

在上述例子中,动作执行的状态可以通过回调函数action_done_callback()来获取。当动作完成时,将根据状态机制执行不同的操作。

通过使用SimpleActionClient(),我们可以方便地监测动作执行状态,并根据状态进行相应的处理。在实际应用中,可以根据需求添加更多的状态处理逻辑。