3줄 요약
1) ros::spin()은 콜백만 처리하다 죽는다. (Blocking)
2) ros::spinOnce()는 한번 콜백을 처리하고 넘어간다. (Non-blocking)
3) rate.sleep()은 무한루프에서 설정한 주기를 맞추기 위해 기다리는 함수이다.
책 [1]의 하단 박스를 번역하면 spin, spinonce를 쓰는 이유는 구독 메시지 큐를 비우는데 사용한다는 것을 알 수 있다.
subscriber를 생성할 때의 구조는 다음과 같다.
ros::Subscriber SUB = NODE_HANDLE.subscribe(TOPIC_NAME, QUEUE_SIZE, POINTER_TO_CALLBACK_FUNCTION)
TOPIC_NAME : 구독할 토픽의 이름으로, "uav/position" 이런 식이다.
QUEUE_SIZE : 메시지 큐 크기인데, 1000개 정도로 충분히 크게 잡아주는게 좋다.
새 메시지가 도착하면 ROS는 콜백 함수를 부를 수 있기 전 까지 구독 메시지 큐에 계속 저장해둔다.
만약 메시지 큐가 가득 찼는데 메시지가 또 온다면, 큐의 가장 오래된 메시지를 지우고 넣는다.
이는 발행 메시지 큐와 비슷한데 구동 방식에 중요한 차이가 있다.
ROS가 발행 메시지 큐를 비울 수 있는 속도는 실질적으로 구독자에게 메시지를 보내는데 걸리는 시간에 달려있는데,
ROS가 구독 메시지 큐를 비울수 있는 속도는 콜백을 얼마나 빨리 처리하는지에 달려있다.
그래서 구독 메시지 큐가 넘칠 가능성을 줄이려면
a) ros::spin 또는 ros::spinOnce를 통해서 주기적으로 콜백이 수행되도록 해주기
b) 각 콜백을 처리하는데 걸리는 시간을 줄인다
ROS 제어 권한 부여하기 : ROS는 사용자가 명시적 권한을 부여할 때만이 자신의 콜백함수를 처리한다. 이러한 과정을 하기 위한 약간 다른 2개의 방법이 있다.
1) spinOnce()
이 코드는 노드가 꺼지기 전까지 ROS에게 노드의 모든 구독에 대해 모든 계류중인 콜백을 실행할 권한을 요청한다.
ros::spinOnce()
2) spin()
이 코드는 노드가 꺼지기 전까지 ROS에게 대기를 요청하고 콜백을 실행할 권한을 요청한다.
ros::spin()
대충 등가표현을 하면 다음과 같다.
while(ros::ok()) {
ros::spinOnce();
}
Reference
1. Jason M. O'Kane, A Gentle Introduction to ROS, 2013, pp.57~59., Available at cse.sc.edu/~jokane/agitr/
2. Quigley, M., Gerkey B. and Smart D. W., Programming Robots with ROS, 2015, Available at alvarestech.com/temp/capp/CMM_Curso/GDT_Forma3D/Programming%20Robots%20with%20ROS%20by%20Morgan%20Quigley,%20Brian%20Gerkey,%20William%20D.%20Smart%20(z-lib.org).pdf
**EOF**
'UAV > ROS' 카테고리의 다른 글
ROS Upstart package (0) | 2021.04.03 |
---|---|
[실수모음] ROS - Unknown CMake command "add_message_files" (0) | 2020.11.28 |
[MAVROS] Tutorial - SITL with iris (4) | 2020.11.16 |