티스토리 뷰

ROS_통신4_타임슬롯문제.pptx
0.45MB

 

1. 문제 : 주기적 발송에서 타임슬롯을 오버하면 어떻게 되는가?

receiver 측에서 토픽을 받을 때, 타임슬롯을 오버하게 되는 경우, 오버된 타임슬롯에서 토픽은 버리는지? 늦은 것을 이어서 처리하는지? 늦은 것을 처리하는데 타임 슬롯을 지키면서 처리하는지?

 

타임 슬롯 개념.

 

1-2. 파이썬 파일

teacher_int32_job.py

#!/usr/bin/env python

import rospy
import timeit
from std_msgs.msg import Int32

rospy.init_node('teacher')

pub = rospy.Publisher('msg_to_student', Int32, queue_size=0)
rate = rospy.Rate(5)

def do_job(time):
	for i in range(0, time):
		pub.publish(i+1)

while not rospy.is_shutdown():
	x = int(input('input number: '))
	print
	total_begin = rospy.Time.now()
	for i in range(5):
		begin = rospy.Time.now()
		do_job(x)
		middle = rospy.Time.now()
		rate.sleep()
		end = rospy.Time.now()
		print 'spend time: ', (middle - begin).to_sec(), ' s'
		print 'sleep time: ', (end - middle).to_sec(), ' s'
		print
	total_end = rospy.Time.now()
	print '--------------------------------------'
	print 'total time: ', (total_end - total_begin).to_sec(), ' s'
	print '--------------------------------------'
	print

 

student_int32.py

#!/usr/bin/env python

import rospy
from std_msgs.msg import Int32

def callback(msg):
	print msg.data

rospy.init_node('student')

sub = rospy.Subscriber('msg_to_student', Int32, callback)

rospy.spin()

 

1-3. 빌드 및 실행

빌드 명령어 : cm

터미널 번호 명령어
#1 roscore
#2 rosrun msg_send student_int32.py
#3 rosrun msg_send teacher_int32_job.py

 

2. 현상 확인

입력 숫자로 100을 입력하였다.

왜 때문인지 나는 첫번째 time slot이 0.2초가 채워지지 않아서 총 시간도 1초에서 약 0.2초가 부족하다.

다른 숫자를 입력해도 마찬가지 결과가 나왔다.

하나의 타임 슬롯에서 하나의 job을 수행하는데, job을 수행하는 데 사용한 시간을 제외한 나머지 시간동안 sleep한다. 이것이 rate.sleep()함수.

아래는 다른 숫자들을 입력했을 때 결과 화면이다.

 

3. 고찰

1)

한 타임슬롯에서 한 번의 job과 rate.sleep()이 발생하는 것이 기본이다.

주어진 타임슬롯에서 자신이 할 일을 마치고 시간이 남으면 잠시 휴식시간을 갖는다.

만약 이전 타임슬롯에서 타임 오버가 발생하였다면, 그 시간만큼을 뺏기는 것과 비슷하다.

이전 타임슬롯의 job이 타임간격보다 오래 걸렸다면 sleep은 거의 발생하지 않는다. 이전 타임슬롯의 job이 끝난 직후 sleep은 스쳐지나가고, 다음 타임슬롯에서 job을 수행한다. 만약 다음 타임슬롯에서 시간이 남는다면, 원래 주기 - 이전 슬롯이 사용한 시간 - 현재 슬롯 job 수행 시간을 뺀 나머지만큼 sleep한다.

 

2)

나의 경우에는 약간 문제가 발생했다.

타임 오버가 발생하지 않는 이상, 전체 수행 시간이 1초로 같아야 한다.

그런데 나는 약 0.8초동안 수행을 하였다. 이것은 첫번째 타임슬롯에서 sleep을 거의 하지 않았기 때문인데, 이유는 잘 모르겠다.

 

4. 참고자료

1) time함수

wiki.ros.org/rospy/Overview/Time

 

rospy/Overview/Time - ROS Wiki

Time and Duration ROS has builtin time and duration primitive types, which rospy provides as the rospy.Time and rospy.Duration classes, respectively. A Time is a specific moment (e.g. "today at 5pm") whereas a Duration is a period of time (e.g. "5 hours").

wiki.ros.org

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함