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

Python中SimpleActionClient()的参数设置和调整

发布时间:2023-12-15 22:29:51

SimpleActionClient是ROS中的一个类,用于实现对一个Action Server的简便调用。在Python中,可以使用rospy中提供的SimpleActionClient类来创建一个Action Client实例。

SimpleActionClient()的参数设置:

- action_name: 指定Action Server的名称。通常为包名/ActionName。

- ActionSpec: 指定Action类型的消息定义,可以使用包名/Action文件名。例如,如果Action消息文件在my_package/action目录下,文件名为MyAction.msg,那么ActionSpec参数应为'my_package/MyAction.action'。

- auto_start: 指定是否自动开始连接Action Server,默认为True。

例子:

import rospy
import actionlib
from my_package.msg import MyAction

def done_cb(state, result):
    # 当Action完成时调用的回调函数
    if state == actionlib.SimpleGoalState.DONE:
        rospy.loginfo("Action completed successfully")
        rospy.loginfo("Result: %s" % result.result)

def active_cb():
    # 当Action进入活动状态时调用的回调函数
    rospy.loginfo("Action is active")

def feedback_cb(feedback):
    # 当接收到Action的反馈信息时调用的回调函数
    rospy.loginfo("Received feedback: %s" % feedback.feedback)

if __name__ == '__main__':
    rospy.init_node('my_action_client')

    # 创建一个SimpleActionClient实例,连接到名为my_action_server的Action Server
    client = actionlib.SimpleActionClient('my_action_server', MyAction)

    # 等待Action Server启动
    rospy.loginfo("Waiting for action server...")
    client.wait_for_server()

    rospy.loginfo("Action server started")

    # 创建一个Goal消息,并设置相应参数
    goal = MyAction()
    goal.input = 10

    # 发送Goal给Action Server,并指定回调函数
    client.send_goal(goal, done_cb=done_cb, active_cb=active_cb, feedback_cb=feedback_cb)

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

    rospy.loginfo("Action completed")

上述例子中,假设目标行为(MyAction)的消息类型定义在my_package/msg目录下的MyAction.msg文件中,其中MyAction消息包含一个输入(input)和一个输出(result)。我们使用一个简单的整数作为输入,并等待Action完成后打印输出结果。

在实例化SimpleActionClient时,我们指定了action_name为'my_action_server'和ActionSpec为'my_package/MyAction.action'。然后我们使用wait_for_server()方法等待与Action Server的连接建立。

之后,我们创建了一个Goal消息,并设置了输入参数。然后调用send_goal()方法将Goal发送给Action Server。我们还指定了回调函数done_cb,active_cb和feedback_cb,用于在相应的状态变化或接收到反馈信息时调用。

最后,我们使用wait_for_result()方法等待Action完成,并在完成后打印相应信息。