티스토리 뷰
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
'ROS' 카테고리의 다른 글
Ubuntu16.04 ROS Kinetic - 통신2) ROS 전송속도 측정 (0) | 2020.12.30 |
---|---|
Ubuntu16.04 ROS Kinetic - 통신5) 노드의 순차 실행 (0) | 2020.12.28 |
Ubuntu16.04 ROS Kinetic - 통신3) 처리 지연 문제 (0) | 2020.12.28 |
Ubuntu16.04 ROS Kinetic - 원격통신 환경 구축 및 실습 (0) | 2020.12.24 |
Ubuntu16.04 ROS Kinetic - 통신1) 노드간 동기화 문제 (0) | 2020.12.24 |
- Total
- Today
- Yesterday
- 8자주행
- VMware
- Ubuntu20.04
- ROS
- C++
- 우분투
- 아두이노 IDE
- 백준알고리즘
- 코드리뷰
- Ubuntu16.04
- python3
- 윈도우 복구
- Python
- sensehat
- 프로그래머스
- filesystem
- 리눅스
- Publisher
- umount
- 초음파센서
- set backspace
- 윈도우
- roslaunch
- Mount
- 포트인식문제
- HC-SR04
- VirtualBox
- 원격 통신
- vue/cli
- subscriber
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |