[ROS2] Package, Node, Launch

TaerinLog·2025년 5월 21일

1. Package

  • ROS2 프로젝트의 기본 단위
  • 노드, 메시지 정의, 실행 스크립트, 설정 파일 등을 모아놓은 폴더 구조

1.1 구조

my_package/
├── package.xml # 패키지 메타정보
├── CMakeLists.txt # 빌드 명세
├── src/ # 노드 소스 코드
├── launch/ # launch 파일
├── config/, msg/, srv/ # (선택) 설정, 메시지, 서비스 정의

1.2 ws 및 패키지 생성

  1. 작업 공간 생성
  • mkdir -p ~/ros2_ws/src
  • cd ~/ros2_ws/src
  1. 패키지 생성
  • ros2 pkg create --build-type ament_python my_package --dependencies rclpy
  1. 패키지 빌드
  • cd ~/ros2_ws
  • colcon build
    ㄴ 결과물이 install/ 디렉토리에 생성
    ㄴ ROS2는 기본적으로 이 디렉토리를 모름
  • source ~/ros2_ws/install/local_setup.bash
    ㄴ 환경 설정을 명시적으로 불러와 패키지와 실행파일을 찾을 수 있게 함

특정 패키지만 빌드

  • --symlink-install
    ㄴ 소스 파일과 패키지를 심볼릭 링크로 연결하여 수정된 파일을 다시 빌드하지 않아도 바로 반영됨
  • --packages-select
    ㄴ 특정 파일만 선택

colcon build --symlink-install --packages-select <package_name>

2. Node

  • 하나의 실행 가능한 단위 프로그램
  • 센서 데이터 처리, 제어 명령 전송, 로직 수행 등 기능별로 나눔
  • 여러 노드를 동시에 실행

2.1 노드 만들기

  • 노드 소스 코드
    ㄴ 경로: ros_ws/src/my_package/my_package
# my_package /my_package/talker.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class Talker(Node):
    def __init__(self):
        super().__init__('talker')
        self.publisher_ = self.create_publisher(String, 'chatter', 10)
        self.timer = self.create_timer(1.0, self.timer_callback)

    def timer_callback(self):
        msg = String()
        msg.data = 'Hello, ROS 2'
        self.publisher_.publish(msg)
        self.get_logger().info(f'Publishing: {msg.data}')

def main():
    rclpy.init()
    node = Talker()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

2.2 실행 파일 설정(setup.py)

entry_points={
    'console_scripts': [
    	// 이 부분 추가
        'talker = my_package.talker:main',
    ],
},

2.3 빌드 및 실행

Launch 파일 없이 실행할 때

  1. 패키지 다시 빌드
cd ~/ros2_ws
colcon build

source ~/ros2_ws/install/local_setup.bash
  1. 노드 직접 실행
    ros2 run <패키지명> <노드명>
    ros2 run my_package talker

  2. 여러 노드를 실행하고 싶으면 터미널 여러 개 열거나 백그라운드 실행
    ros2 run my_package node1 &
    ros2 run my_package node2 &

노드 확인

  • ros2 node list
  • ros2 node info /talker

3. Launch

  • 여러 노드를 한 번에 실행하거나, 환경 설정을 함께 자동화하는 Python 기반 실행 스크립트

3.1 구조

  • Package 하위에 생성
    📦 Package
    ├── 📄 Node (Python, C++)
    ├── 🚀 Launch (실행 스크립트)
    └── 📄 설정파일 (config, param, msg, srv 등)

3.2 Launch 파일 생성 및 작성

# my_package/launch/talker_launch.py
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
    	# 생성한 노드를 여기에 추가하면 됨
        Node(
            package='my_package',
            executable='talker',
            name='talker_node',
            output='screen'
        ),
        
        # 추가 노드 예시
        Node(
            package='my_package',
            executable='talker2',
            name='talker_node2',
            output='screen'
        ),
        ...
    ])

3.3 Launch 파일 실행

  • ros2 launch my_package talker_launch.py
profile
taerin

0개의 댓글