ROS2 이론 정리

Ros2 파일 분석 및 실행 과정

dawon-project 2025. 4. 16. 00:57

ROS2를 사용하기 위한 전제 조건

Underlay vs Overlay

underlay : 기본이 되는 워크스페이스로 ROS의 기존 설치 패키지들을 의미 -> 기본 제공 패키지(ex. turtlesim 등)
ex) /opt/ros/humble

overlay : 그 위에 덧씌우는 내가 만든 패키지들이 있는 워크스페이스
ex) ~/ros2_ws/install/setup.bash

-> 목적 : 기존 ROS2에 내가 만든 패키지들을 "덧붙이기" 하는 것

 

-> 결과적으로 내가 만든 ROS2 패키지를 실행시키거나 빌드할 떄는 underlay + overlay가 합쳐져서 작동해야한다.

* 순서 중요 : 항상 underlay -> overlay 순으로 source 해야함

Source 명령어 : 리눅스 쉘(Bash 등)에서 제공하는 내장 명령어(builtin command)로,  쉘 스크립트를 현재 터미널에 적용하는 명령어

  • 쓰는 이유
    • 해당 터미널에서 환경 변수/ 경로 설정 등을 유지하기 위함
  • ROS2에서 setup.bash를 통해 ROS2 명령어를 인식시키는 용도로 사용
source [스크립트 파일 경로]
# 스크립트 파일을 현재 셀에서 실행해서 그 안의 설정이나 변수들이 지금 열려있는 터미널에 적용되게 해준다.
  • setup.bash 파일이란?
    • 시스템 환경을 셋팅해주는 명령어가 탐긴 스크립트로, ROS2에서는 ROS2 환경 변수(기본 제공 라이브러리들, ros2 명령어 인식, 패키지 경로 등)들을 설정해주는 스크립트로서 사용된다.
      -> ROS2 초기 환경 세팅
    • ROS2를 사용하기 위한 필수 조건

Sourcing(소싱) : 터미널에서 ROS2나 작업 공간을 사용할 수 있게 설정 정보를 불러오는 것
-> "ros2 run" , "ros2 topic" 등과 같은 명령어가 동작하려면 해당 ROS2 버전이나 작업 공간의 경로들이 시스템에 등록되어 있어야하고, 이 작업을 해주는 것이 Sourcing이다.

  • Sourcing을 하지 않는다면?
    • ros2 run my_package .. 했는데 "패키지를 찾을 수 없습니다"라고 나옴
      -> 패키지 인식 안 됨
    • ROS2 명령어를 사용할 수 없음
source /opt/ros/humble/setup.bash
# ROS2 Humble 버전의 환경 설정을 불러옴
# ros2에서 제공하는 기본 라이브러리들을 사용하기위한 터미널을 켰을때 실행해야하는 필수 명령어
source install/setup.bash
# 내가 만든 워크 스페이스를 사용하고자할때 사용하는 명령어

 

즉, ROS2를 사용하려면 터미널을 처음 켰을때 항상 아래의 두가지 명령어를 입력하는 것이 전제 조건이다. 이렇게 항상 쳐주는 작업을 안하기 위해서 ".bashrc"에 해당 명령어를 적어주면 터미널이 켜질때마다 Ros2를 사용할 수 있다.

source /opt/ros/humble/setup.bash
source install/setup.bash

 

그러면 ".bashrc" 가 뭘까?

.bashrc : bash 쉘이 실행될 때 자동으로 실행되는 설정 파일
-> 터미널을 킬 때마다 자동으로 읽는 초기화 스크립트
-> 경로 : ~/.bashrc

-> 위의 두 명령어를 터미널을 킬때마다 매번 입력해주는 것이 귀찮기 때문에 그 코드를 터미널 열때마다 자동으로 실행되도록 함

 

ROS2 패키지 생성 명령어

ros2 pkg create --build-type ament_cmake <패키지명> # c++ 기반 패키지 생성 명령어
ros2 pkg create --build-type ament_python <패키지명> # python 기반 패키지 생성 명령어

# 옵션
--dependencies # 의존성 패키지 지정( rclcpp, std_msgs 등)
--license # 라이센스 지정(Apache-2.0, MIT, BSD 등)
--node-name # 기본 노드 파일 생성(Python 전용)

패키지 생성 시 생성되는 파일/디렉토리와 역할

 c++ 패키지 구조도 (ament_cmake)

my_cpp_package/
├── CMakeLists.txt # 빌드 설정 파일 (CMake)
├── package.xml # 패키지 메타 정보
├── include/ # C++ 헤더 파일 위치
 │         └── my_cpp_package/
├── src/ # C++ 소스 파일 위치
└── README.md # (옵션) 설명 문서

c++ 패키지 내부 파일/폴더설명

CMakeLists.txt 컴파일을 위한 CMake 설정 파일 /빌드 시스템 규칙 정의 (CMake 사용)
package.xml 패키지에 대한 메타 정보(패키지 이름, 버전, 의존성, 종속성 등)가 포함된 파일
include/ 헤더 파일 저장소
src/ C++ 소스 파일들이 담긴 디렉토리
README.md 패키지 설명 문서 (선택사항)

 

Python 패키지 구조도(ament_python)

my_py_package/
├── package.xml # 패키지 메타 정보
├── setup.py # Python 설치 설정
├── setup.cfg # setup.py 보조 설정
├── resource/
 │         └── my_py_package # 빈 파일 (패키지 인식용)
├── /<package_name> # Python 소스 디렉토리
 │         └── __init__.py
├── test/ # 테스트 (Linters) 코드 디렉토리 
└── README.md # (옵션) 설명 문서

 

python 패키지 내부 파일/폴더 설명

package.xml 패키지에 대한 메타 정보(패키지 이름, 버전, 의존성, 종속성 등)가 포함된 파일
setup.py 패키지 설치, 엔트리포인트 정의 등의 패키지를 컴파일 하는 방법에 대한 지침이 포함된 파일
setup.cfg 스크립트가 설치될 위치를 정의하는 파일
resource/패키지명 ROS 명령어에서 인식하도록 함 (빈 파일)
-> 패키지명이 일치하지 않으면 오류 발생
/<package_name> *이 디렉토리는 항상 패키지와 같은 이름을 갖는다.
*이 폴더 안에 모든 Python 스크립트가 들어가게 되며 기본적으로 빈 __init__.py 파일이 포함되어 있다.
test/ pytest용 테스트 코드 저장
README.md 설명 문서

python 패키지 생성시 파일 구조 이미지

setup.py : Python 패키지의 경우 사용되는 파일로, ROS2 Python 노드를 위한 설치 및 배포 정보를 정의

  • setuptools를 사용하여 패키지를 배포할 준비를 할때 필요한 정보를 담고 있다.
  • setuptools 라이브러리를 사용하며 패키지를 빌드하고 설치하는데 필요한 설정 포함

setup.cfg : setup.py를 보조하는 설정 파일. 일부 빌드/패키징 설정 포함

  • 패키지 빌드/설치/배포에 사용(버전/설명/패키지 의존성 관리 등)
  • setuptools를 사용하여 패키지를 배포 준비 시 필요한 정보 제공

 

package.xml : 패키지의 메타데이터를 정의하는 파일
->패키지 이름, 버전, 의존성, 라이센스, 등의 정보 포함

  • 사용 목적
    • 소스 코드를 실제 실행 가능한 프로그램이나 라이브러리로 변환하기 위해 colon build를 수행하면 package.xml을 참조하여 빌드할 패키지들 사이의 의존성 해석 및 적절한 빌드 순서 결정
    • 패키지 의존성 설치 시 rosdep이 이 파일의 정보를 기반으로 함

린터(Linters) : 코드 스타일 검사 도구
-> 코드가 표준 스타일 가이드에 맞게 작성되었는지 자동으로 검사해주는 도구

  • 코드 스타일 검사 ex) 들여쓰기, 변수명 스타일 등
  • 문법 오류 사전에 감지
  • 버그 발생 가능성 있는 코드 포착

Linters 설정법 : package.xml에 Linter 의존성 추가

  • <test_depend> : ROS2의 package.xml 파일 안에서 테스트할 때만 필요한 의존성을 명시하는 태그

 

패키지 빌드하기 : 패키지를 만든 후 패키지를 빌드 즉, "colcon build" 해야 ros2 명령어를 통해 실행 할 수 있다.

  • 패키지 생성 후 꼭 해야 하는 작업인 이유?
    • 패키지를 생성하면 package.xml, src, 등 여러 파일과 폴더가 만들어지지만 이 상태에서는 아직 ROS2가 패키지를 인식하지 못한다.
  • 패키지 빌드 명령어
colcon build
# 현재 워크스페이스의 src/ 디렉토리 아래에 있는 모든 패키지를 찾아서 빌드하는 명령어
# c++ 이면 CMakeLists.txt , python이면 setup.py 기준으로 빌드

colcon build --symlink-install --packages-select <package_name> 
# 해당 패키지만 선택해서 빌드하는 명령어
# 대규모 프로젝트의 경우 모든 패키지를 컴파일하게 되면 시간이 오래 걸리기 때문에 위의 명령어를 사용해서 변경한 패키지만 컴파일하는 것이 바람직하다.

 

  • 빌드 만들어지는 디렉토리 3가지
디렉토리 설명
build/ 실제 빌드 중간 결과물 저장
install/ *실행 가능한 환경 설정과 실행 파일 저장
* 패키지를 빌드하고 나서 ROS2가 그 패키지를 인식하고 실행할 수 있도록 만들어주는 공간
*ROS2 시스템에서 실제로 실행되는 건 이 디렉토리에 있는 파일들이 실행된다.
log/ 빌드 로그 저장
  • 빌드 시 실행 파일이 install 디렉토리에 만들어지는 형식

 

최종 요약

  1. 패키지 생성
  2. colcon build로 빌드
  3. 터미널 생성 후 source install/setup.bash 입력
  4. 실행하고 싶은 노드 실행 명령어 입력
    -> ros2 run, ros2 launch 등

 

문제) 다른 사람의 패키지를 가지고왔을 때 나의 패키지 명이랑 겹치는 것이 있는 경우에 두 패키지가 충돌해서 colcon build가 안된다.

해결법)  둘 중 하나의 패키지명을 바꿔야한다.

그리고 그 과정에서 두 개 중 하나의 패키지명을 바꿀때 형광 네모 친 부분의 이름이 모두 일치해야 한다.

 

my_first_package.zip
0.01MB