코드
클라이언트
#! /usr/bin/env python
import rospy
import actionlib
from chapter5.msg import TimerAction, TimerGoal, TimerResult
rospy.init_node('timer_action_client')
client = actionlib.SimpleActionClient('timer', TimerAction)
client.wait_for_server()
goal = TimerGoal()
goal.time_to_wait = rospy.Duration.from_sec(5.0)
client.send_goal(goal)
client.wait_for_result()
print('Time elapsed: %f' % (client.get_result().time_elapsed.to_sec()))
서버
#! /usr/bin/env python
import rospy
import time
import actionlib
from basics.msg import TimerAction, TimerGoal, TimerResult
def do_timer(goal):
start_time = time.time()
time.sleep(goal.time_to_wait.to_sec())
result = TimerResult()
result.time_elapsed = rospy.Duration.from_sec(time.time() - start_time)
result.updates_sent = 0
server.set_succeeded(result)
rospy.init_node('timer_action_server')
server = actionlib.SimpleActionServer('timer', TimerAction, do_timer, False)
server.start()
rospy.spin()
출력값
action 파일 (
"catkin_make" 할 시에 약간의 추가작업이 발생한다.
Timer.action 파일이 처리되어 메시지-정의 파일이 몇개 생성된다. ( 액션토픽을 관리하기 위한 메시지토픽들 )
ex) TimerAction.msg , TimerActionFeedback.msg , TimerActionGoal.msg , TimerActionResult.msg , TimerFeedback.msg , TimerGoal.msg , TimerResult.msg
이 메시지들은 ROS 토픽상에 만들어져 액션클라이언트/서버 프로토콜을 구현하는 데 사용된다. 메시지지만 클래쓰다.
다음 사진을 보면 이해하기 좋을듯
TimerGoal 메시지 토픽 ( 여기안엔 내가 선언한 자료형인 duration 형이 들어 있음 )
TimerActionGoal 메시지 토픽 ( 여기안에 내가 만든 액션토픽인 TimerGoal이 포함되있다 )
rostopic info 로 timer ( 액션을 구성하고 있는 토픽이 광고될 이름공간을 결정하는 서버이름 ) 의 액션토픽정보를 찍어보면 result는 퍼블리셔(server)가 , goal은 서브스크라이버(action)이 가지고 있다.
개인정리 요약본
서버
1
7 자기가 만든 Timer.action 파일에서 메시지 클래스 임포트
11 현재시작 저장
12 ROS duration 자료형인 time_to_wait이다., Goal에서 요청한 시간 동안 일시정지 함.
13 TimerResult자료형인 result 선언
14~16 예를들어 5->4->3...->0 되면 성공하고 server.??? 에 저장되는듯
19 전역 범위로 돌아가서 평ㄹ상시처럼 노드를 초기화하고 명명함
20 simple_action_server.py 라 SimpleActionServer 로 지은거? , 인자를 보면 4개가 있다. (1) 액션을 구성하고 있는 토픽이 광고될 이름공간을 결정하는 서버이름이다. (2) 서버가 처리하는 액션의 자료형 TimerAction을 사용한다. (3) Goal 콜백이다. (4) 서버의 자동시작을 방지하기 위해서 False
21,22 액션서버 실행 후, Goal에 도달할 때까지 기다리는 rospy.spin() 루프사용
클라이언트
9 자기 이름 명명 roscore로 data 갈껄
10 client 객체 생성 , // 인자 : (1) 액션을 구성하고 있는 토픽이 광고될 이름공간을 결정하는 서버이름이다. (2) 서버가 처리하는 액션의 자료형 TimerAction을 사용한다.
11 액션 서버가 동작할 때까지 대기 ( service 토픽과 유사 ) , 액션서버의 동작여부는 다섯 개의 광고딘 토픽이 확인 될시
12 TimerGoal 자료형객체 goal 생성 후
13 goal구조체의 "time_to_wait" 필드에 '5.0'을 하드코딩으로 채움
14 그 후 client에서 server로 goal메시지가 전달함 ( 객체.send_goal(goal) )
15 server로 부터 오는 result를 대기 , 정상동작 : 약 5초 동안 여기서 실행이 멈출거다.
16 result 도착하면 get_result()사용해서 client객체로부터 result를 검색한다. 그리고 server에서 보고된 time_elapsed 필드 출력함.
'ROS_python_정리 > msgs , srv , action' 카테고리의 다른 글
ros1_srv (0) | 2022.05.27 |
---|---|
ros1_msg (0) | 2022.04.18 |
action fancy예제 _2 ( 비동기부분 포함 , srvs + msgs ) (0) | 2022.04.12 |
action 정리 (0) | 2022.04.10 |
댓글