ROS2

[ROS2] ros2 topic list로 떠야할 topic이 뜨지 않는 error(+ daemon의 역할)

고집호랑이 2023. 8. 27. 10:05

가끔 여러 topic을 publish하고 subscribe하는 노드나 런치 파일을 실행시켰음에도, ros2 topic list를 확인해보면 

나와야할 topic은 나오지 않고 아래와 같은 2가지 기본 topic만 나오는 경우가 있습니다.

/parameter_events
/rosout

 

이는 현재 사용가능한 topic이 저 2가지 밖에 없다는 뜻으로 다른 topic을 활용하는 노드나 런치 파일은 제대로 실행되지 않을 것입니다.

 

Solution

해결 방법은 간단합니다. 바로 터미널 창에 ros2 daemon stop ros2 daemon start를 순서대로 입력 후 다시 노드나 런치파일을 실행시키면 ros2 topic list에 사용가능한 topic이 제대로 잘 뜨는 것을 확인할 수 있습니다. 

 

$ ros2 daemon stop 
$ ros2 daemon start

 

직관적으로 알 수 있듯이 daemon을 정지시키고 다시 시작시킨 것만으로 에러가 해결되었습니다. 무엇 때문에 이런 에러가 일어났는지 알기 위해선 우선 daemon의 역할부터 알아야 할 필요가 있습니다.

 

Ros2 daemon

데몬(Daemon)은 ROS2 도구들의 빠른 실행을 위해 도입된 툴입니다. ROS2는 DDS, RTPS와 같은 통신 미들웨어의 도입으로 ROS1처럼 ROS 마스터(roscore로 실행하는)를 사용하지 않고 노드가 서로를 찾을 수 있는 탈중앙화된 방법을 사용합니다. 

 

하지만 이는 새로 시작되는 모든 노드가 다른 노드를 찾는 브로드케스트(broadcast)를 보내고 응답이 올 때까지 기다려야 하기 때문에 마스터를 사용하는 방식보다 시간이 더 오래 걸린다는 단점이 있습니다. 이는 특히 빠르게 작업을 수행한 다음 종료하려는 수명 짧은 노드에게는 치명적이죠.

 

이 때문에 각종 ros2cli(ROS 2 Command Line Interface)의 툴들을 실행할 때 daemon이 함께 실행됩니다. Daemon하루 종일 대기하면서 검색 프로토콜 트래픽(discovery protocol traffic)을 수신하고 어떤 노드가 살아 있고 어디에 있는지를 기록하는 노드입니다. 그런 다음 새 노드가 다른 노드가 어디에 있는지 알고 싶을 때 자체 DDS 검색 프로세스를 우회하고 알려진 포트에서 ROS 2 데몬에 연결하여 그래프 정보를 요청할 수 있습니다. 이를 이용해 ROS 그래프에 대한 정보를 저장하면 매번 쿼리를 요청하는 것보다 빠르게 응답을 받아올 수 있죠.

 

이렇게 daemon은 노드들을 자동으로 탐지하여 네트워크 상에 등록하고 노드들이 같은 네트워크 도메인 ID를 가지고 있는지 확인하며 네트워크 내에서 효율적으로 데이터를 교환할 수 있도록 돕습니다. 또한 daemon는 노드가 발행(publish) 및 구독(subscribe)하는 토픽을 발견하여 등록하고 토픽과 서비스의 변경 및 갱신을 관리하는 역할을 수행합니다.

 

따라서 topic을 publish하거나 subscribe하는 코드에 문제가 없음에도 원하는 topic이 제대로 출력되지 않은 것은 daemon이 초기화되지 않아 원래 나와야 할 토픽 정보가 올바르게 수집되지 않았거 다른 백그라운드 프로세스나 서비스와 충돌이 발생하여 daemon이 원활하게 동작하지 않았기 때문이라고 짐작할 수 있습니다. 

 

daemon을 중지시켰다 다시 시작시키면 daemon을 직접 초기화 시킨 것이 되고 충돌된 daemon을 중지시켰으니 에러가 해결된 것이죠.

 

Reference

https://answers.ros.org/question/327348/what-is-ros2-daemon/