Python中使用SimpleActionServer()构建基本的动作服务器
发布时间:2023-12-19 05:13:37
在Python中,可以使用python_actionlib库中的SimpleActionServer()来构建基本的动作服务器。SimpleActionServer提供了一个用于处理动作请求和发送动作反馈的简单接口。
下面是一个使用SimpleActionServer()构建动作服务器的简单示例:
import rospy
import actionlib
from my_robot_msgs.msg import DoSomethingAction, DoSomethingFeedback, DoSomethingResult
# 定义动作服务器类
class DoSomethingServer:
def __init__(self):
# 初始化动作服务器
self.server = actionlib.SimpleActionServer('do_something', DoSomethingAction, self.execute, False)
self.server.start()
rospy.loginfo("Action Server started")
def execute(self, goal):
# 获取动作目标
target_value = goal.target_value
# 创建动作反馈对象
feedback = DoSomethingFeedback()
# 执行动作操作
for i in range(target_value):
# 更新动作反馈信息
feedback.progress = i+1
self.server.publish_feedback(feedback)
# 模拟运行时间
rospy.sleep(1)
# 创建动作结果对象
result = DoSomethingResult()
# 设置动作结果
result.final_value = target_value
# 发送动作结果
self.server.set_succeeded(result)
rospy.loginfo("Action completed successfully")
if __name__ == '__main__':
# 初始化ROS节点
rospy.init_node('do_something_server')
# 创建动作服务器对象
server = DoSomethingServer()
# 循环等待
rospy.spin()
上面的示例中,定义了一个名为DoSomethingServer的动作服务器类。该类初始化了一个名为do_something的动作服务器,接受类型为DoSomethingAction的动作请求,并在执行动作时发布动作反馈和最后的动作结果。
在execute方法中,首先获取动作目标的值,然后创建DoSomethingFeedback对象来发布动作反馈。接着通过for循环模拟执行动作的操作,并在每次循环中更新动作反馈信息。执行完动作后,创建DoSomethingResult对象来设置最终的动作结果,并使用set_succeeded方法发送动作结果。
最后,在主程序中初始化ROS节点和创建DoSomethingServer对象,通过spin()方法来循环等待动作请求。
要运行上述示例,首先需要创建一个名为DoSomethingAction的动作文件,包含两个字段:target_value和final_value。然后,还需要将动作文件的消息类型添加到my_robot_msgs包中,并确保其它相关依赖项已正确安装。
运行示例后,可以使用rostopic命令来查看动作服务器发布的动作反馈和结果:
rostopic echo /do_something_server/feedback rostopic echo /do_something_server/result
总结来说,通过使用SimpleActionServer(),我们可以轻松构建基本的动作服务器,并处理动作请求、发送动作反馈和最终结果。这样可以方便地与其他节点进行通信和协调任务。
