이번 실습에서는 Python을 이용한 ROS 2 프로그래밍의 기본 구조를 학습하고, Publisher와 Subscriber를 직접 작성하여 Topic 기반 통신을 실습하였다.
앞서 생성한 my_first_ros_rclpy_pkg 패키지를 이용하여 Python 기반 ROS 2 노드를 작성하였다.
패키지는 다음과 같은 구조로 구성되어 있다.
my_first_ros_rclpy_pkg/
├── my_first_ros_rclpy_pkg/
│ └── __init__.py
├── resource/
│ └── my_first_ros_rclpy_pkg
├── test/
├── package.xml
├── setup.py
└── setup.cfg
package.xml에서는 패키지의 의존성과 빌드 타입을 설정하고, setup.py에서는 Python 패키지와 실행할 노드를 설정한다.
먼저 helloworld_publisher.py를 작성하여 Publisher 노드를 구현하였다.
Publisher는 helloworld라는 Topic을 생성하고, String 타입의 메시지를 1초마다 발행하도록 구성하였다.
msg = String()
msg.data = 'Hello World: {0}'.format(self.count)
self.helloworld_publisher.publish(msg)
Publisher를 실행하면 다음과 같이 메시지가 순차적으로 발행된다.
[INFO] [helloworld_publisher]: Published message: Hello World: 43
[INFO] [helloworld_publisher]: Published message: Hello World: 44
[INFO] [helloworld_publisher]: Published message: Hello World: 45
다음으로 helloworld_subscriber.py를 작성하였다.
Subscriber는 helloworld Topic을 구독하고 Publisher가 전달한 메시지를 받아 출력하도록 구현하였다.
def subscribe_topic_message(self, msg):
self.get_logger().info(
'Received message: {0}'.format(msg.data)
)
Publisher에서 발행한 메시지가 Subscriber에서 정상적으로 수신되는 것을 확인하였다.
[INFO] [Helloworld_subscriber]: Received message: Hello World: 43
[INFO] [Helloworld_subscriber]: Received message: Hello World: 44
[INFO] [Helloworld_subscriber]: Received message: Hello World: 45
작성한 Python 노드를 ros2 run 명령어로 실행할 수 있도록 setup.py의 console_scripts에 등록하였다.
entry_points={
'console_scripts': [
'helloworld_publisher = my_first_ros_rclpy_pkg.helloworld_publisher:main',
'helloworld_subscriber = my_first_ros_rclpy_pkg.helloworld_subscriber:main',
],
},
이를 통해 다음과 같이 각 노드를 실행할 수 있도록 설정하였다.
ros2 run my_first_ros_rclpy_pkg helloworld_publisher
ros2 run my_first_ros_rclpy_pkg helloworld_subscriber
작성한 Python 패키지를 워크스페이스에서 빌드하였다.
cd ~/robot_ws
colcon build --symlink-install --packages-select my_first_ros_rclpy_pkg
빌드가 완료된 후 워크스페이스의 환경을 적용하였다.
source ~/robot_ws/install/setup.zsh
Publisher와 Subscriber를 각각 실행하여 두 노드 사이의 Topic 통신을 확인하였다.
Publisher에서는 Hello World 메시지가 계속 발행되고, Subscriber에서는 동일한 메시지를 정상적으로 수신하는 것을 확인하였다.

위 결과에서 Publisher가 Hello World 메시지를 발행하고 있으며, Subscriber가 해당 메시지를 수신하는 모습을 확인할 수 있다.
또한 별도의 터미널에서 다음 명령어를 실행하여 현재 Topic을 확인하였다.
ros2 topic list
실행 결과 /helloworld Topic이 확인되었다.
/helloworld
/parameter_events
/rosout
이후 다음 명령어를 이용하여 /helloworld Topic으로 전달되는 데이터를 직접 확인하였다.
ros2 topic echo /helloworld
실행 결과 다음과 같이 Publisher에서 발행한 메시지가 출력되었다.
data: 'Hello World: 52'
---
data: 'Hello World: 53'
---
data: 'Hello World: 54'
---
이번 실습을 통해 Python 기반 ROS 2 패키지의 기본 구조와 Python 노드 작성 방법을 학습하였다.
또한 setup.py에 실행 파일을 등록하고 colcon build를 이용하여 패키지를 빌드한 후, ros2 run 명령어로 노드를 실행하는 과정을 실습하였다.
최종적으로 Publisher → Topic → Subscriber 구조를 직접 구현하여 ROS 2의 기본적인 Topic 통신이 이루어지는 과정을 확인하였다.
특히 ros2 topic list를 이용해 활성화된 Topic을 확인하고, ros2 topic echo를 이용해 실제 Topic 데이터를 확인함으로써 노드 간 메시지 전달 과정을 직접 확인할 수 있었다.
ROS 2에서 Python을 이용해 노드를 작성하고 패키지를 빌드·실행하는 기본적인 과정을 익혔다. 또한 Publisher와 Subscriber를 통해 Topic 기반 통신의 기본 구조를 직접 구현하고 확인하였다.