Python中使用SimpleActionServer()构建基本的动作服务
在Python中,可以使用SimpleActionServer()类来构建基本的动作服务,它是ROS(Robot Operating System)中提供的一种用于处理动作(Action)的通信机制。SimpleActionServer()类实现了一个简单的动作服务器,可以用于接收客户端的请求并执行相应的动作。
下面是一个使用SimpleActionServer()构建基本动作服务的例子:
#!/usr/bin/env python
import rospy
import actionlib
from my_package.msg import MyAction, MyResult, MyFeedback
class MyActionServer(object):
# 初始化动作服务器
def __init__(self):
# 创建动作服务器
self._as = actionlib.SimpleActionServer("my_action", MyAction, self.execute, False)
# 设置回调函数
self._as.register_preempt_callback(self.preempt_callback)
# 初始化动作结果和反馈
self._result = MyResult()
self._feedback = MyFeedback()
# 执行动作的回调函数
def execute(self, goal):
# 检查动作是否被中止
if self._as.is_preempt_requested():
rospy.loginfo("Action preempted")
self._as.set_preempted(self._result)
return
# 执行动作并发送反馈信息
rate = rospy.Rate(1) # 1Hz
for i in range(1, goal.count + 1):
if self._as.is_preempt_requested():
rospy.loginfo("Action preempted")
self._as.set_preempted(self._result)
return
# 更新反馈信息
self._feedback.progress = i
self._as.publish_feedback(self._feedback)
rate.sleep()
# 动作执行完成后发送结果
self._as.set_succeeded(self._result)
# 中止动作的回调函数
def preempt_callback(self):
self._result.result = "preempted"
self._as.set_preempted(self._result)
if __name__ == "__main__":
# 初始化ROS节点
rospy.init_node("my_action_server")
# 创建动作服务器对象
server = MyActionServer()
# 启动动作服务器
server._as.start()
# 循环等待动作请求
rospy.spin()
上述代码中,首先导入了必要的ROS和actionlib库,并定义了一个名为MyActionServer的类。在MyActionServer类的构造函数中进行了必要的初始化操作,如创建动作服务器、设置回调函数以及初始化动作结果和反馈。
execute函数为动作执行的回调函数,在该函数中首先检查动作是否被中止,如果是,则设置动作为中止状态,并返回。否则,依据动作请求的count参数来执行相应的动作,通过发布反馈信息来告知客户端当前的执行进度。在每次循环中,都检查动作是否被中止,如果是,则设置动作为中止状态,并返回。
preempt_callback函数为动作中止的回调函数,在该函数中设置动作的结果为"preempted",并将动作设置为中止状态。
在if __name__ == "__main__"中,首先初始化ROS节点,然后创建MyActionServer对象,并启动动作服务器。最后,通过rospy.spin()来等待动作请求的到达。
在使用这个例子时,需要将其保存到一个ROS package的Python脚本中,并创建相应的消息文件my_package.msg来定义动作消息的格式。
以上就是使用SimpleActionServer()构建基本动作服务的一个例子。通过使用SimpleActionServer(),可以方便地创建动作服务器,并且可以实现对动作的执行、中止和结果反馈等操作。
