Python中使用actionlibSimpleActionServer()实现多个动作目标的处理
在Python中,可以使用actionlib.SimpleActionServer()实现多个动作目标的处理。SimpleActionServer()是SimpleActionServer类的构造函数,它提供了一个简单的接口来处理动作目标。
以下是使用actionlib.SimpleActionServer()实现多个动作目标的处理的示例代码:
#!/usr/bin/env python
import rospy
import actionlib
from my_action_pkg.msg import MyAction, MyActionFeedback, MyActionResult
class MyActionServer(object):
def __init__(self):
# 初始化动作服务器
self._as = actionlib.SimpleActionServer('my_action_server', MyAction, self.execute, False)
self._as.start()
def execute(self, goal):
# 在这里处理动作目标
feedback = MyActionFeedback()
result = MyActionResult()
# 执行动作目标
for i in range(goal.count):
rospy.sleep(1) # 模拟动作的执行时间
feedback.percent_complete = float(i + 1) / goal.count * 100
self._as.publish_feedback(feedback)
if self._as.is_preempt_requested():
# 如果收到新的动作目标,则中断当前动作
self._as.set_preempted()
rospy.loginfo('Preempted')
return
# 判断动作是否成功完成
if self._as.is_preempt_requested():
# 因为在执行动作时收到了新的目标,所以动作未完成
result.result = False
rospy.loginfo('Not successful')
self._as.set_preempted(result)
else:
# 动作成功完成
result.result = True
rospy.loginfo('Successful')
self._as.set_succeeded(result)
if __name__ == '__main__':
rospy.init_node('my_action_server')
server = MyActionServer()
rospy.spin()
在以上的例子中,首先导入了需要的库和消息类型。然后定义了一个MyActionServer类,在类的构造函数中初始化了动作服务器,并启动了服务器。execute方法是处理动作目标的核心逻辑,通过循环来执行动作的每一个步骤,并通过publish_feedback方法发布反馈信息。
如果在执行动作中收到了新的动作目标(即收到了中断请求),则通过set_preempted方法来中断当前动作,并在日志中打印中断信息。
最后,在动作完成时,通过set_succeeded方法将结果设置为成功,并在日志中打印成功信息。如果在执行动作时收到了新的动作目标,则将结果设置为未成功,并在日志中打印未成功信息。
在main函数中,首先初始化ROS节点,然后创建了一个MyActionServer对象,最后进入了ROS的主循环中。
以上代码中的my_action_pkg是示例动作消息包的名称,你可以将其替换为你实际使用的动作消息包的名称。同时,还需要根据实际情况来自定义动作目标的处理逻辑。
参考资料:
- [ROS文档:actionlib](http://wiki.ros.org/actionlib)
- [ROS Wiki:SimpleActionServer](http://wiki.ros.org/actionlib_msgs/Tutorials/SimpleActionServer%28Python%29)
