在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动作服务器。
