반응형

3줄 요약

1) ros::spin()은 콜백만 처리하다 죽는다. (Blocking)

2) ros::spinOnce()는 한번 콜백을 처리하고 넘어간다. (Non-blocking)

3) rate.sleep()은 무한루프에서 설정한 주기를 맞추기 위해 기다리는 함수이다.

 

책 [1]의 하단 박스를 번역하면 spin, spinonce를 쓰는 이유는 구독 메시지 큐를 비우는데 사용한다는 것을 알 수 있다.

 

subscriber를 생성할 때의 구조는 다음과 같다.

ros::Subscriber SUB = NODE_HANDLE.subscribe(TOPIC_NAMEQUEUE_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**

728x90

'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

+ Recent posts