ROS Melodic에서 Custom Topic 찾을 수 없을 때 해결 방법

대상: ROS Melodic에서 msg를 직접 정의해서 custom topic을 만들었는데, rostopic echo나 코드에서 해당 토픽을 찾지 못하는 문제가 생긴 개발자
환경: Ubuntu 18.04, ROS Melodic, catkin 워크스페이스, C++/Python 노드 공통


1. 문제/주제 요약

대표적인 상황은 이런 식입니다.

  • 직접 MyCustom.msg를 만들고 빌드까지 했다고 생각했는데
  • rostopic list에 내가 기대한 /my_topic이 안 뜸
  • 또는 rostopic echo /my_topic 하면
  • ERROR: topic [/my_topic] does not appear to be published yet
  • 코드에서 Subscriber를 만들었는데 콜백이 전혀 안 들어옴
  • rostopic info 해도 해당 토픽이 없다고 나오는 경우

이 글에서는 “custom topic(커스텀 msg 타입 사용한 토픽)을 만들었는데 토픽이 안 보이거나 찾을 수 없을 때” 확인해야 할 체크리스트와 해결 순서를 정리합니다.


2. 원인/배경 설명

핵심 포인트는 두 가지입니다.

  1. “토픽 이름” 문제
    • 노드가 실제로 그 이름의 토픽을 publish 하고 있어야 목록에 뜹니다.
    • 노드가 안 떠 있거나, 이름/네임스페이스가 다르면 당연히 안 보입니다.
  2. “Custom msg 빌드/설정” 문제
    • msg 파일만 만들어놓고
      • CMakeLists.txt에서 add_message_files, generate_messages, catkin_package 설정을 안 했거나
      • package.xml에 message_generation, message_runtime 의존성이 없으면
    • 메시지가 생성되지 않아서, 노드 코드에서 제대로 advertise/subscribe가 안 되는 문제가 생깁니다.

대부분의 “토픽을 찾을 수 없음” 이슈는 아래 중 하나입니다.

  • 노드 자체가 안 돌아감 (빌드 실패, 실행 X, 런치 파일에서 죽음)
  • 토픽 이름이 다름 (/my_topic vs my_topic vs /ns/my_topic)
  • workspace 빌드 후 새 터미널에서 source를 안 함
  • custom msg 설정이 불완전해서 노드가 실행 에러 후 바로 종료
  • ROS_MASTER_URI / 네트워크 문제 (멀티 PC 환경일 때)

3. 해결 순서 (체크리스트 및 예제)

3-1. 기본: roscore & 노드 실행 여부 확인

  1. roscore가 켜져 있는지 확인
  2. roscore
  3. Publisher 노드를 실행했는지 확인
    • C++ 예:
    • rosrun my_pkg my_publisher_node
    • Python 예:
    • rosrun my_pkg my_publisher.py
  4. 노드 목록 확인
    • 여기서 내가 만든 노드가 없다 → 노드가 아예 안 떠 있는 상태입니다.
  5. rosnode list
  6. 노드 로그/에러 확인
    • 직접 터미널에 에러가 찍히는지 확인
    • 런치 파일 사용 시:띄우고 에러 메시지 잘 읽어보기 (custom msg import 실패, 타입 mismatch 등)
    • roslaunch my_pkg my_launch.launch

3-2. rostopic list / info로 실제 토픽 확인

노드가 정상 실행 중이라면:

rostopic list
  • 여기에 /my_topic / /ns/my_topic 같은 토픽 이름이 실제로 존재해야 합니다.

특정 토픽이 있는지 확인:

rostopic list | grep my_topic

토픽이 있다면 타입/Publisher 정보 확인:

rostopic info /my_topic
  • Type: my_pkg/MyCustom
  • Publishers: /my_publisher_node 이런 식으로 나와야 정상

아예 안 나오면 노드가 그 토픽을 publish 하지 않는 것입니다.
이 경우는 msg 문제가 아니라, 코드 상의 토픽 이름/조건문/네임스페이스 문제일 가능성이 큽니다.


3-3. Custom msg 설정 제대로 했는지 체크

“custom topic”이라 해서 msg 타입만 만들어놓고 빌드 설정을 빼먹기 쉽습니다.
아래를 순서대로 확인하세요.

3-3-1. msg 파일 위치 확인

cd ~/catkin_ws/src/my_pkg
ls msg
# MyCustom.msg

msg/ 폴더 아래에 MyCustom.msg가 있는지 확인합니다.

MyCustom.msg 예:

float32 x
float32 y
string name

3-3-2. package.xml 설정

package.xml에 아래 의존성 태그가 모두 있는지 확인합니다.

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
<build_depend>std_msgs</build_depend>
<exec_depend>std_msgs</exec_depend>

(필요한 다른 메시지 패키지가 있다면 그때그때 추가)


3-3-3. CMakeLists.txt 설정

CMakeLists.txt에서 이 부분들을 꼭 확인합니다.

  1. find_package 부분에 message_generation 포함
  2. find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation )
  3. add_message_files에 내가 만든 msg 등록
  4. add_message_files( FILES MyCustom.msg )
  5. generate_messages에서 의존 메시지 패키지 지정
  6. generate_messages( DEPENDENCIES std_msgs )
  7. catkin_package에 message_runtime 포함
  8. catkin_package( CATKIN_DEPENDS message_runtime std_msgs )

이렇게 설정한 뒤 워크스페이스 루트에서 다시 빌드합니다.

cd ~/catkin_ws
catkin_make

빌드가 성공하면, 새 터미널(혹은 해당 터미널)에서:

source devel/setup.bash

이후 아래 명령으로 msg 타입이 잘 생성되었는지 확인:

rosmsg show my_pkg/MyCustom
  • 여기서 메시지 내용이 정상적으로 보이면 msg 생성은 성공입니다.
  • 여기서부터는 토픽 이름/노드 로직 문제일 가능성이 높습니다.

3-4. 코드에서 Custom topic을 올바르게 사용하는지 확인

3-4-1. Python 예제

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import rospy
from my_pkg.msg import MyCustom

def talker():
    pub = rospy.Publisher('my_topic', MyCustom, queue_size=10)
    rospy.init_node('my_talker', anonymous=True)
    rate = rospy.Rate(10)

    msg = MyCustom()
    count = 0

    while not rospy.is_shutdown():
        msg.x = 1.0
        msg.y = 2.0
        msg.name = "test_%d" % count

        pub.publish(msg)
        rospy.loginfo(msg)
        count += 1
        rate.sleep()

if __name__ == '__main__':
    talker()

체크할 것:

  • from my_pkg.msg import MyCustom
    • my_pkg 이름이 실제 패키지와 정확히 일치하는지
  • rospy.Publisher(‘my_topic’, MyCustom, …)
    • 토픽 이름 ‘my_topic’과 Subscriber/rostopic에서 보는 이름이 일치하는지

3-4-2. C++ 예제 (간단)

#include <ros/ros.h>
#include <my_pkg/MyCustom.h>

int main(int argc, char** argv)
{
  ros::init(argc, argv, "my_talker");
  ros::NodeHandle nh;

  ros::Publisher pub = nh.advertise<my_pkg::MyCustom>("my_topic", 10);

  ros::Rate rate(10);
  int count = 0;

  while (ros::ok())
  {
    my_pkg::MyCustom msg;
    msg.x = 1.0;
    msg.y = 2.0;
    msg.name = "test_" + std::to_string(count);

    pub.publish(msg);
    ROS_INFO_STREAM("Publish: " << msg);

    rate.sleep();
    count++;
  }
}

체크할 것:

  • #include 경로 에러가 없는지
    → 이게 안 되면 custom msg가 제대로 빌드 안 된 것
  • my_pkg::MyCustom 네임스페이스/타입 이름이 정확한지
  • nh.advertise(“my_topic”, 10);
    • 토픽 이름 동일한지

3-5. 네임스페이스/런치 파일로 인해 이름이 달라진 경우

런치 파일에서 에 ns나 remap을 사용하면 실제 토픽 이름이 바뀔 수 있습니다.

예:

<node pkg="my_pkg" type="my_publisher_node" name="my_talker" ns="robot1">
  <remap from="my_topic" to="custom_topic"/>
</node>

이 경우 실제 토픽 이름은 /robot1/custom_topic이 됩니다.

  • rostopic list | grep custom_topic
  • rostopic echo /robot1/custom_topic

처럼 네임스페이스가 붙은 이름을 사용해야 합니다.

rosnode info /my_talker로 노드가 어떤 토픽을 publish 하는지 보는 것도 매우 유용합니다.


3-6. source 누락 / 여러 워크스페이스 중첩 문제

다음도 매우 자주 나오는 원인입니다.

  1. workspace를 새로 만들거나 msg를 수정한 뒤 catkin_make만 하고 source를 안 한 경우
    • 해결:
    • cd ~/catkin_ws catkin_make source devel/setup.bash
  2. 여러 개 워크스페이스를 사용할 때 오래된 워크스페이스를 마지막에 source 해버린 경우
    • 예:순서가 반대로 되어 있으면, my_pkg를 못 찾을 수 있습니다.
    • source ~/catkin_old/devel/setup.bash source ~/catkin_ws/devel/setup.bash
    • 해결: 올바른 순서로 다시 source 하거나, 문제가 되는 부분을 ~/.bashrc에서 정리

4. 추가 팁 / 자주 하는 실수

  1. msg 수정 후 catkin_make 안 함
    • MyCustom.msg 수정하고 바로 코드 컴파일/실행하면 타입 mismatch 에러 또는 빌드 에러 발생
    • msg 변경 시 반드시 다시 catkin_make 필요
  2. 타입 이름 오타
    • rosmsg show my_pkg/MyCustom에서 보이는 이름과 코드에서 쓰는 이름을 1:1로 맞추기
    • 특히 대소문자(MyCustom vs Mycustom) 틀리면 바로 에러
  3. 토픽 이름에 / 여부
    • 코드: “my_topic”
    • rostopic echo /my_topic
    • 이 경우 실제로는 /my_topic로 해석되긴 하지만, 네임스페이스가 섞이면 혼란이 커집니다.
    • 가능하면 절대 이름(/my_topic)을 명시적으로 사용하는 것도 방법입니다.
  4. 멀티 PC 환경에서 ROS_MASTER_URI/ROS_IP 설정 문제
    • 한 PC에서 토픽은 뜨는데, 다른 PC에서 rostopic list 했을 때 안 보이는 경우
    • 이건 custom msg 문제가 아니라 네트워크/환경변수 문제입니다.
  5. Subscriber만 보고 “토픽이 없다”고 착각
    • Publisher가 아예 없는 상태에서 Subscriber만 띄운 후 rostopic list를 보면, 그 토픽이 안 나옵니다.
    • 최소 1개의 Publisher가 있어야 토픽이 ROS graph에 나타납니다.

5. 정리

  • Custom topic이 안 보일 때는
    1. 노드가 실제로 돌고 있는지,
    2. 토픽 이름/네임스페이스가 기대와 같은지,
    3. **custom msg 설정(CMakeLists.txt, package.xml, catkin_make, source)**이 올바른지
      이 세 가지를 우선적으로 확인하면 됩니다.
  • rosmsg show, rostopic list, rostopic info, rosnode info를 조합해서 보면 “어디까지는 잘 되고, 어디부터가 문제인지”가 명확해집니다.
  • 위 체크리스트만 차근차근 따라가면 “토픽이 안 보인다/찾을 수 없다” 계열 문제는 대부분 해결할 수 있습니다.

댓글 남기기