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

在Python中使用SimpleActionClient()执行ROS动作

发布时间:2023-12-15 22:24:24

在Python中,可以使用SimpleActionClient()类来执行ROS动作服务器。下面是一个使用例子,用于执行一个名为"fibonacci"的ROS动作服务器:

#!/usr/bin/env python

import rospy
import actionlib
from my_actions.msg import FibonacciAction, FibonacciGoal, FibonacciResult

def fibonacci_client():
    # 初始化一个ROS节点(必须)
    rospy.init_node('fibonacci_client')

    # 创建一个SimpleActionClient对象,指定动作类型为FibonacciAction
    client = actionlib.SimpleActionClient('fibonacci', FibonacciAction)

    # 等待服务器启动
    rospy.loginfo("等待服务器启动...")
    client.wait_for_server()

    # 创建一个目标对象,并设置要求的数列长度
    goal = FibonacciGoal()
    goal.order = 10

    # 发送目标到服务器,并设置回调函数,用于获取结果
    client.send_goal(goal, done_cb=done_callback)
    
    # 等待动作完成
    rospy.loginfo("等待动作完成...")
    client.wait_for_result()

def done_callback(state, result):
    # 当动作完成时,调用此回调函数
    if state == actionlib.GoalStatus.SUCCEEDED:
        rospy.loginfo("动作成功完成!")
        rospy.loginfo("结果:%s", result.sequence)
    else:
        rospy.loginfo("动作未完成!")

if __name__ == '__main__':
    try:
        fibonacci_client()
    except rospy.ROSInterruptException:
        pass

在上面的例子中,我们首先导入了必要的Python库和消息类型。在fibonacci_client()函数中,我们首先初始化一个ROS节点并创建一个名为"fibonacci_client"的节点。然后,我们创建一个SimpleActionClient对象,并指定动作类型为FibonacciAction(自定义的消息类型)。接着,我们通过调用wait_for_server()方法来等待"fibonacci"动作服务器启动。

然后,我们创建一个FibonacciGoal对象,并设置要求的数列长度为10。然后,我们通过调用send_goal()方法将目标发送给服务器,并指定一个回调函数done_callback来获取结果。

最后,我们调用wait_for_result()方法来等待动作完成。在动作完成后,将调用回调函数done_callback,其中state参数表示动作的状态,result参数表示返回的结果。在回调函数中,我们可以根据状态来处理结果。

done_callback()函数中,我们首先检查动作的状态是否为SUCCEEDED(表示动作成功完成),如果是,则打印出结果。否则,我们打印出动作未完成的消息。

if __name__ == '__main__':块中,我们将调用fibonacci_client()函数来启动动作客户端。

注意:在实际使用时,我们需要根据自己的情况修改动作类型、目标、回调函数等参数。

希望上述例子可以帮助你在Python中使用SimpleActionClient()执行ROS动作服务器。