대상: 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. 원인/배경 설명
핵심 포인트는 두 가지입니다.
- “토픽 이름” 문제
- 노드가 실제로 그 이름의 토픽을 publish 하고 있어야 목록에 뜹니다.
- 노드가 안 떠 있거나, 이름/네임스페이스가 다르면 당연히 안 보입니다.
- “Custom msg 빌드/설정” 문제
- msg 파일만 만들어놓고
- CMakeLists.txt에서 add_message_files, generate_messages, catkin_package 설정을 안 했거나
- package.xml에 message_generation, message_runtime 의존성이 없으면
- 메시지가 생성되지 않아서, 노드 코드에서 제대로 advertise/subscribe가 안 되는 문제가 생깁니다.
- msg 파일만 만들어놓고
대부분의 “토픽을 찾을 수 없음” 이슈는 아래 중 하나입니다.
- 노드 자체가 안 돌아감 (빌드 실패, 실행 X, 런치 파일에서 죽음)
- 토픽 이름이 다름 (/my_topic vs my_topic vs /ns/my_topic)
- workspace 빌드 후 새 터미널에서 source를 안 함
- custom msg 설정이 불완전해서 노드가 실행 에러 후 바로 종료
- ROS_MASTER_URI / 네트워크 문제 (멀티 PC 환경일 때)
3. 해결 순서 (체크리스트 및 예제)
3-1. 기본: roscore & 노드 실행 여부 확인
- roscore가 켜져 있는지 확인
- roscore
- Publisher 노드를 실행했는지 확인
- C++ 예:
- rosrun my_pkg my_publisher_node
- Python 예:
- rosrun my_pkg my_publisher.py
- 노드 목록 확인
- 여기서 내가 만든 노드가 없다 → 노드가 아예 안 떠 있는 상태입니다.
- rosnode list
- 노드 로그/에러 확인
- 직접 터미널에 에러가 찍히는지 확인
- 런치 파일 사용 시:띄우고 에러 메시지 잘 읽어보기 (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에서 이 부분들을 꼭 확인합니다.
- find_package 부분에 message_generation 포함
- find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation )
- add_message_files에 내가 만든 msg 등록
- add_message_files( FILES MyCustom.msg )
- generate_messages에서 의존 메시지 패키지 지정
- generate_messages( DEPENDENCIES std_msgs )
- catkin_package에 message_runtime 포함
- 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 누락 / 여러 워크스페이스 중첩 문제
다음도 매우 자주 나오는 원인입니다.
- workspace를 새로 만들거나 msg를 수정한 뒤 catkin_make만 하고 source를 안 한 경우
- 해결:
- cd ~/catkin_ws catkin_make source devel/setup.bash
- 여러 개 워크스페이스를 사용할 때 오래된 워크스페이스를 마지막에 source 해버린 경우
- 예:순서가 반대로 되어 있으면, my_pkg를 못 찾을 수 있습니다.
- source ~/catkin_old/devel/setup.bash source ~/catkin_ws/devel/setup.bash
- 해결: 올바른 순서로 다시 source 하거나, 문제가 되는 부분을 ~/.bashrc에서 정리
4. 추가 팁 / 자주 하는 실수
- msg 수정 후 catkin_make 안 함
- MyCustom.msg 수정하고 바로 코드 컴파일/실행하면 타입 mismatch 에러 또는 빌드 에러 발생
- msg 변경 시 반드시 다시 catkin_make 필요
- 타입 이름 오타
- rosmsg show my_pkg/MyCustom에서 보이는 이름과 코드에서 쓰는 이름을 1:1로 맞추기
- 특히 대소문자(MyCustom vs Mycustom) 틀리면 바로 에러
- 토픽 이름에 / 여부
- 코드: “my_topic”
- rostopic echo /my_topic
- 이 경우 실제로는 /my_topic로 해석되긴 하지만, 네임스페이스가 섞이면 혼란이 커집니다.
- 가능하면 절대 이름(/my_topic)을 명시적으로 사용하는 것도 방법입니다.
- 멀티 PC 환경에서 ROS_MASTER_URI/ROS_IP 설정 문제
- 한 PC에서 토픽은 뜨는데, 다른 PC에서 rostopic list 했을 때 안 보이는 경우
- 이건 custom msg 문제가 아니라 네트워크/환경변수 문제입니다.
- Subscriber만 보고 “토픽이 없다”고 착각
- Publisher가 아예 없는 상태에서 Subscriber만 띄운 후 rostopic list를 보면, 그 토픽이 안 나옵니다.
- 최소 1개의 Publisher가 있어야 토픽이 ROS graph에 나타납니다.
5. 정리
- Custom topic이 안 보일 때는
- 노드가 실제로 돌고 있는지,
- 토픽 이름/네임스페이스가 기대와 같은지,
- **custom msg 설정(CMakeLists.txt, package.xml, catkin_make, source)**이 올바른지
이 세 가지를 우선적으로 확인하면 됩니다.
- rosmsg show, rostopic list, rostopic info, rosnode info를 조합해서 보면 “어디까지는 잘 되고, 어디부터가 문제인지”가 명확해집니다.
- 위 체크리스트만 차근차근 따라가면 “토픽이 안 보인다/찾을 수 없다” 계열 문제는 대부분 해결할 수 있습니다.