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

Python中使用SimpleActionServer()构建基本行为服务的示例

发布时间:2023-12-19 05:15:40

在Python中,可以使用SimpleActionServer()来构建基本行为服务。行为服务用于执行一系列预定义的操作,并根据结果返回响应。下面是一个带有使用例子的示例:

首先,我们需要安装rospyactionlib库,这两个库是用于ROS中的行为服务开发的必需库。可以使用以下命令来安装它们:

pip install rospy
pip install actionlib

接下来,我们将创建一个名为SimpleServer的节点,实现一个行为服务器来执行square操作。行为服务器将接收整数输入,并将其平方返回。

import rospy
import actionlib
from demo.msg import SquareAction, SquareResult

class SimpleServer:
    def __init__(self):
        # 初始化动作服务器
        self.server = actionlib.SimpleActionServer('square_action', SquareAction, self.execute, False)
        self.server.start()
        rospy.loginfo("Action server started")

    def execute(self, goal):
        # 行为执行的回调函数
        result = SquareResult()
        
        # 获取输入的整数值
        number = goal.number
        rospy.loginfo("Received goal: %d", number)
        
        # 计算平方并设置结果
        result.squared_number = number * number
        
        # 设置行为的执行状态为成功
        self.server.set_succeeded(result)
        rospy.loginfo("Goal achieved: %d", result.squared_number)


if __name__ == '__main__':
    rospy.init_node('simple_server')
    server = SimpleServer()
    rospy.spin()

在上面的示例中,我们首先导入了必要的库,并创建了一个SimpleServer类。然后,我们在构造函数中初始化了一个SimpleActionServer实例,该实例使用SquareAction消息类型作为行为的目标和结果。SquareAction消息类型定义了一个整数字段number,用于传递输入值。SquareResult消息类型定义了一个整数字段squared_number,表示计算结果。

execute方法中,我们获取输入的整数值,计算其平方,并设置结果。然后,我们将行为的执行状态设置为成功,并输出结果。最后,在main函数中,我们初始化了一个ROS节点,并创建了一个SimpleServer对象。rospy.spin()函数用于保持程序持续运行,并处理ROS消息。

要在ROS中运行这个示例,我们还需要定义SquareActionSquareResult消息类型。在ROS工作空间的src/demo/msg文件夹中,我们可以创建一个名为SquareAction.msg的文件,输入以下内容:

int32 number
---
int32 squared_number

然后,我们运行以下命令来构建ROS包:

catkin_make

最后,我们可以在终端运行该示例:

rosrun demo simple_server.py

现在,我们可以使用rostopic pub命令来调用行为服务器并发送目标值:

rostopic pub /square_action demo/SquareAction "{number: 5}"

在终端中,我们将看到行为服务器输出的日志信息,包括接收的目标值和计算的结果。