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(),我们可以方便地监测动作执行状态,并根据状态进行相应的处理。在实际应用中,可以根据需求添加更多的状态处理逻辑。
