Ubuntu ROS 실습(29)

zeusqoi·2일 전

개인공부 - ubuntu

목록 보기
48/56

이번 실습에서는 Python을 이용한 ROS 2 프로그래밍의 기본 구조를 학습하고, Publisher와 Subscriber를 직접 작성하여 Topic 기반 통신을 실습하였다.


1. Python 패키지 구조

앞서 생성한 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 패키지와 실행할 노드를 설정한다.


2. Publisher 작성

먼저 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

3. Subscriber 작성

다음으로 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

4. setup.py 실행 설정

작성한 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

5. 패키지 빌드

작성한 Python 패키지를 워크스페이스에서 빌드하였다.

cd ~/robot_ws

colcon build --symlink-install --packages-select my_first_ros_rclpy_pkg

빌드가 완료된 후 워크스페이스의 환경을 적용하였다.

source ~/robot_ws/install/setup.zsh

6. Publisher와 Subscriber 실행

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 기반 통신의 기본 구조를 직접 구현하고 확인하였다.

0개의 댓글