使用SimpleActionServer()在Python中搭建一个简易的服务器端处理器
在Python中,我们可以使用SimpleActionServer()来搭建一个简易的服务器端处理器。SimpleActionServer()是ROS的一个功能包,用于实现一个简单的动作服务器。
在下面的例子中,我们将使用SimpleActionServer()实现一个简单的回声机器人。回声机器人会接收一个字符串,并将其作为回复返回给客户端。
首先,我们需要导入需要的ROS包和模块:
import rospy import actionlib from my_msgs.msg import EchoAction, EchoFeedback, EchoResult
然后,我们可以定义回声机器人的类,它将包含必要的回调函数和其他方法:
class EchoRobot(object):
def __init__(self):
self._as = actionlib.SimpleActionServer('echo', EchoAction, self.execute, False)
self._as.start()
def execute(self, goal):
r = rospy.Rate(1)
feedback = EchoFeedback()
result = EchoResult()
for i in range(1, goal.repeat + 1):
if self._as.is_preempt_requested():
rospy.loginfo('Preempted')
self._as.set_preempted()
return
feedback.current_repeat = i
self._as.publish_feedback(feedback)
rospy.loginfo('Echoing: {}'.format(goal.message))
result.echoed_message += goal.message + '
'
r.sleep()
self._as.set_succeeded(result)
if __name__ == '__main__':
rospy.init_node('echo_robot')
robot = EchoRobot()
rospy.spin()
在上述代码中,我们首先初始化了SimpleActionServer,传递了服务器名称'echo'、动作类型EchoAction和回调函数self.execute。然后,我们启动了服务器。
回调函数self.execute将会被调用来处理客户端的请求。在这个例子中,我们设置了一个循环,根据请求中的repeat字段重复回显消息,并通过publish_feedback()将每次的重复次数发送给客户端。
如果收到了预取消请求(preempt request),我们将设置服务器的状态为“预取消(preempted)”并返回。
最后,我们返回回显的结果给客户端,并设置服务器的状态为“成功(succeeded)”。
注意,我们还使用了rospy.Rate()函数来控制回声的速率,确保每秒只回显一次。
下面是一个简单的客户端代码,用于与我们的回声机器人进行通信:
import rospy
import actionlib
from my_msgs.msg import EchoGoal, EchoAction
rospy.init_node('echo_client')
client = actionlib.SimpleActionClient('echo', EchoAction)
client.wait_for_server()
goal = EchoGoal()
goal.message = 'Hello World'
goal.repeat = 5
client.send_goal(goal)
client.wait_for_result()
result = client.get_result()
print(result.echoed_message)
在这个客户端代码中,我们首先初始化了SimpleActionClient,传递了服务器名称'echo'和动作类型EchoAction。
然后,我们等待服务器准备好并发送一个回声目标(goal),目标中包含了要回显的消息和重复次数。
之后,我们等待服务器的处理完毕,并获取回声结果(result)。最后,我们打印出回声的消息。
以上就是使用SimpleActionServer()在Python中搭建一个简易的服务器端处理器的例子。你可以根据自己的需求修改代码,实现其他功能。
