Python中使用SimpleActionServer()实现简单动作服务器
在Python中,可以使用SimpleActionServer()类来实现一个简单的动作服务器。这个类是actionlib包提供的一个工具,用于处理动作请求和生成动作结果。
首先,我们需要导入rospy和simple_action_server模块:
import rospy from actionlib import SimpleActionServer
接下来,我们定义一个动作消息类型。假设我们要创建一个名为FibonacciAction的动作服务器,该服务器将接收一个整数作为输入,然后计算该整数对应的斐波那契数列,并将结果作为动作结果返回。
我们可以使用actionlib包提供的生成器工具来自动生成Fibonacci.action消息类型的代码。在终端中,进入到action文件夹所在的目录,然后运行以下命令:
rosrun actionlib_msgs genaction.py Fibonacci
执行命令后,将在当前目录中生成FibonacciAction.msg和FibonacciActionGoal.msg等消息类型文件。
下面是Fibonacci.action文件中的内容:
int32 order --- int32[] sequence
这定义了一个名为FibonacciAction的动作消息类型,该动作消息包含一个int32类型的order字段作为输入,以及一个int32[]类型的sequence字段作为输出。
接下来,我们创建一个动作服务器类FibonacciActionServer,继承SimpleActionServer类,并重写__init__()和execute_callback()方法。
class FibonacciActionServer:
def __init__(self):
# 初始化动作服务器
self.server = SimpleActionServer('fibonacci', FibonacciAction, self.execute_callback, False)
self.server.start()
def execute_callback(self, goal):
# 处理动作请求,计算斐波那契数列
order = goal.order
sequence = self.calculate_fibonacci(order)
# 发布动作结果
result = FibonacciActionResult()
result.sequence = sequence
self.server.set_succeeded(result)
def calculate_fibonacci(self, order):
# 计算斐波那契数列
sequence = [0, 1]
for i in range(2, order + 1):
sequence.append(sequence[i-1] + sequence[i-2])
return sequence
在__init__()方法中,我们初始化了一个名为fibonacci的动作服务器,并指定了它的类型为FibonacciAction。第三个参数self.execute_callback是一个回调函数,用于处理动作请求。
在execute_callback()方法中,我们先获取动作请求中的order字段,然后调用calculate_fibonacci()方法计算斐波那契数列。接下来,我们创建一个动作结果对象,并将计算得到的数列赋值给result.sequence字段。最后,调用self.server.set_succeeded(result)方法,将结果发布到动作服务器。
calculate_fibonacci()方法是一个简单的计算斐波那契数列的函数。
接下来,我们需要在main()函数中实例化FibonacciActionServer类,并运行rospy.spin()来保持程序持续运行:
if __name__ == "__main__":
rospy.init_node("fibonacci_action_server")
server = FibonacciActionServer()
rospy.spin()
现在,我们可以运行这个Python脚本,启动一个名为fibonacci_action_server的动作服务器。在终端中运行以下命令:
rosrun package_name file_name.py
在另一个终端中,我们可以使用rostopic命令来发送动作请求,例如请求计算斐波那契数列前10项:
rostopic pub /fibonacci/goal fibonacci/FibonacciActionGoal "{header: auto, goal_id: auto, goal: {order: 10}}"
服务器将处理请求并返回动作结果。
以上就是使用SimpleActionServer()实现简单动作服务器的示例。你可以根据需要自定义动作消息类型和实现逻辑,来实现不同的动作服务器。
