알 수 없는 사용자 2022. 4. 10. 16:22

Action 기본 설명

Action Workflow


소스코드

fibonacci_action.7z
0.18MB


 

코드 모음

더보기

fibonacci_server.py

#!/usr/bin/env python
import rospy
import actionlib

import actionlib_tutorials.msg

class FibonacciAction (object):

    _feedback = actionlib_tutorials.msg.FibonacciFeedback()
    _result = actionlib_tutorials.msg.FibonacciResult()
    
    def __init__(self,name):
        self._action_name=name
        self._as=actionlib.SimpleActionServer(self._action_name,actionlib_tutorials.msg.FibonacciAction, execute_cb=self.execute_cb, auto_start=False)
        self._as.start()
    
    def execute_cb(self,goal):
        r = rospy.Rate(1)
        success = True
        
        self._feedback.sequence = []
        self._feedback.sequence.append(0)
        self._feedback.sequence.append(1)
        
        rospy.loginfo('%s: Executing, creating fibonacci sequence of order %i with seeds %i, %i'%(self._action_name, goal.order, self._feedback.sequence[0], self._feedback.sequence[1]))


        for i in range(1,goal.order):
            if self._as.is_preempt_requested():
                rospy.loginfo('%s: Preempted'%self._action_name)
                self._as.set_preempted()
                success = False
                break
            self._feedback.sequence.append(self._feedback.sequence[i]+self._feedback.sequence[i-1])
            self._as.publish_feedback(self._feedback)
            
            r.sleep()
        
        if success:
            self._result.sequence=self._feedback.sequence
            rospy.loginfo('%s: Succeeded'%self._action_name)
            self._as.set_succeeded(self._result)



if __name__ == '__main__':
    rospy.init_node('fibonacci')
    server = FibonacciAction(rospy.get_name())
    rospy.spin()

 --------------------------------------------------------------------------------------------------------------------------

fibonacci_client.py

#!/usr/bin/env python
import rospy
import actionlib
import actionlib_tutorials.msg
import sys

def fibonacci_client():
    client = actionlib.SimpleActionClient('fibonacci',actionlib_tutorials.msg.FibonacciAction)
    client.wait_for_server()
    goal = actionlib_tutorials.msg.FibonacciGoal(order=20)
    client.send_goal(goal)
    client.wait_for_result()
    return client.get_result()

if __name__ == '__main__':
    try:
        rospy.init_node('fibonacci_client')
        result = fibonacci_client()
        print "Result:", ', '.join([str(n) for n in result.sequence])
    except rospy.ROSInterruptException:
        print "program inerrupted before comletion", file(sys.stderr)

 


 

fibonacci_client.py

8 클라이언트 객체 생성

9 서버 생성전까지 대기

10~11 서버에 goal 전송

12 서버로 부터 결과 대기 , 결과 recieve시 get_result() 함수로 결과 리턴

 

 


fibonacci_server.py