# ros2\_ws 폴더

`ros2_ws`는 ROS2 작업을 위한 **워크스페이스 디렉토리**로, ROS2 패키지를 작성하고 관리하는 데 필요한 여러 폴더와 파일이 포함된다. ROS2 워크스페이스를 올바르게 구성하기 위해서는 몇 가지 필수 디렉토리와 파일이 있어야 한다.

#### `ros2_ws` 폴더 구조

ROS2 워크스페이스는 보통 다음과 같은 구조로 이루어진다:

```
ros2_ws/
├── src/
├── build/
├── install/
└── log/
```

**1. `src/` 디렉토리**

* **설명**: ROS2 패키지의 소스 코드가 포함되는 디렉토리이다. 모든 ROS2 패키지는 이 `src` 폴더 내에 위치해야 한다.
* **용도**: `src` 폴더에 패키지를 생성하고, ROS2 노드, 메시지 정의 파일, 서비스 정의 파일 등을 작성한다.
* **예시**: `ros2 pkg create my_robot_package` 명령어로 패키지를 생성하면 `src` 디렉토리에 새로운 패키지 디렉토리가 생성된다.

**2. `build/` 디렉토리**

* **설명**: `colcon build` 명령어를 실행하면 생성되는 디렉토리로, ROS2 패키지의 빌드 아티팩트(컴파일된 파일)가 저장된다.
* **용도**: 패키지를 빌드하는 동안 생성되는 임시 파일과 중간 파일들이 여기에 저장된다. `CMake`나 `ament` 빌드 시스템을 사용하여 생성된 빌드 파일들을 포함한다.
* **주의**: 이 폴더를 삭제하고 다시 빌드해도 문제없다. 필요시 `rm -rf build/` 명령으로 삭제하여 깨끗한 빌드를 할 수 있다.

**3. `install/` 디렉토리**

* **설명**: 빌드된 ROS2 패키지가 설치되는 디렉토리이다. `setup.bash`와 같은 환경 설정 파일도 이 위치에 생성된다.
* **용도**: ROS2 패키지를 실행하고, 의존성을 연결하기 위해 필요한 환경 설정 파일들이 생성되며, `colcon build`를 통해 빌드가 완료되면 패키지가 여기에 설치된다.
* **내용**: `install/` 폴더 안에는 각 패키지에 대한 설치 파일과 `setup.bash`, `local_setup.bash` 등 환경 설정 파일이 포함된다.
* **주의**: `install` 폴더를 삭제하면 설치된 모든 패키지와 설정 파일이 제거되므로, 다시 빌드해야 한다.

**4. `log/` 디렉토리**

* **설명**: 빌드 및 실행 중에 생성된 로그 파일들이 저장되는 디렉토리이다.
* **용도**: 패키지를 빌드하거나 노드를 실행할 때 발생하는 모든 로그 정보가 저장된다. 오류나 경고, 디버깅 메시지를 확인할 때 유용하다.
* **삭제 가능**: 로그 파일은 문제가 발생했을 때 진단용으로 사용하므로, 필요 없을 경우 삭제해도 된다.

#### ROS2 워크스페이스 설정

`ros2_ws` 폴더를 설정하고 사용하기 위해 다음 절차를 따른다.

1. **`src` 폴더에 패키지 생성**:

   ```bash
   mkdir -p ros2_ws/src
   cd ros2_ws/src
   ros2 pkg create my_robot_package
   ```
2. **워크스페이스 빌드**:

   ```bash
   cd ..
   colcon build
   ```
3. **환경 설정**: 빌드 후 생성된 `setup.bash` 파일을 소싱하여 환경 변수를 설정한다.

   ```bash
   source install/setup.bash
   ```

이 구조를 통해 `ros2_ws` 폴더에서 ROS2 패키지를 효과적으로 개발하고 관리할 수 있다.

### src 폴더

`src` 폴더는 ROS2 워크스페이스(`ros2_ws`)의 가장 중요한 디렉토리 중 하나로, **ROS2 패키지의 소스 코드와 모든 개발 파일이 포함**되는 위치이다. 이 디렉토리에서 ROS2의 패키지 구조를 만들고, 각종 노드, 메시지, 서비스, 액션 등을 정의할 수 있다.

#### `src` 폴더의 역할

* **패키지의 기본 위치**: `src` 폴더에 위치한 각 패키지가 ROS2에서 인식된다. 모든 ROS2 패키지는 이 폴더 내에 있어야 `colcon` 빌드 시스템에 의해 인식되고 빌드될 수 있다.
* **의존성 관리**: `src` 폴더에 있는 패키지 간에는 ROS2에서 제공하는 의존성 관리 시스템을 통해 상호 참조하거나 의존할 수 있다.
* **버전 관리**: `src` 폴더는 보통 Git과 같은 버전 관리 시스템을 통해 관리되며, 여러 패키지를 하나의 워크스페이스에서 버전 관리할 수 있다.

#### `src` 폴더 구조

`src` 폴더는 여러 개의 ROS2 패키지를 포함할 수 있다. 각 패키지는 독립된 폴더로 구분되며, ROS2의 표준 구조를 따른다.

```
ros2_ws/
└── src/
    ├── my_robot_package/
    │   ├── src/               # C++ 소스 파일
    │   ├── launch/            # Launch 파일들
    │   ├── include/           # 헤더 파일
    │   ├── msg/               # 메시지 정의 파일
    │   ├── srv/               # 서비스 정의 파일
    │   ├── CMakeLists.txt     # CMake 빌드 파일
    │   └── package.xml        # 패키지 정보 및 의존성 정의
    └── another_package/
```

#### `src` 폴더에 패키지 생성

`src` 폴더 내에서 ROS2 패키지를 생성하려면, 다음 명령어를 사용한다:

```bash
cd ros2_ws/src
ros2 pkg create my_robot_package --build-type ament_cmake
```

위 명령어는 `my_robot_package`라는 이름의 패키지를 `ament_cmake` 빌드 타입으로 생성한다. 이렇게 하면 `src` 폴더 내에 `my_robot_package` 디렉토리가 만들어진다.

#### 패키지 구성 요소 설명

* **`src/`**: 패키지 내의 소스 코드 파일이 들어가는 디렉토리이다. 주로 C++ 또는 Python 코드가 포함된다.
* **`launch/`**: ROS2 노드를 실행할 때 사용할 `launch` 파일을 저장하는 디렉토리이다.
* **`include/`**: C++ 패키지의 경우, 헤더 파일이 들어가는 디렉토리이다.
* **`msg/`**: ROS2 메시지 파일(.msg)이 포함된다. 커스텀 메시지 타입을 정의할 때 사용된다.
* **`srv/`**: ROS2 서비스 파일(.srv)이 포함된다. 커스텀 서비스 타입을 정의할 때 사용된다.
* **`CMakeLists.txt`**: 빌드 시스템에 의해 패키지를 빌드하는 데 필요한 설정 파일이다.
* **`package.xml`**: 패키지의 메타데이터(이름, 버전, 의존성)를 정의하는 XML 파일이다.

#### 빌드 및 실행

`src` 폴더에 패키지를 추가한 후, 워크스페이스 최상위 디렉토리에서 다음 명령어로 빌드할 수 있다.

```bash
cd ~/ros2_ws
colcon build
```

빌드가 완료되면 `setup.bash`를 소싱하여 환경을 설정한다.

```bash
source install/setup.bash
```

이제 `src` 폴더에 포함된 패키지 내 노드, 서비스 등을 ROS2 명령어로 실행하거나 사용할 수 있다.

`src` 폴더는 이렇게 **ROS2 패키지의 코드 및 구성 요소를 관리**하는 핵심적인 위치이다.

### install 폴더

`install` 폴더는 ROS2 워크스페이스에서 **빌드 후 생성된 파일**들이 설치되는 디렉토리로, ROS2 패키지의 실행 및 환경 설정에 중요한 역할을 한다. `install` 디렉토리는 `colcon build` 명령을 실행할 때 자동으로 생성되며, ROS2 워크스페이스 내 모든 패키지가 이곳에 설치된다.

#### `install` 폴더의 주요 역할

* **실행 파일 및 라이브러리 저장**: 각 패키지의 실행 파일과 라이브러리가 설치되어, ROS2 노드와 실행 가능한 파일들을 포함한다.
* **환경 설정 파일 생성**: ROS2 워크스페이스 및 패키지 환경을 설정하는 여러 `setup` 파일들이 여기 포함된다.
* **의존성 관리**: 여러 패키지가 동일 워크스페이스에 설치되어 서로의 의존성을 관리할 수 있게 한다.

#### `install` 폴더의 주요 파일 및 디렉토리

`install` 폴더는 ROS2 워크스페이스의 루트에서 다음과 같은 파일과 디렉토리를 포함할 수 있다.

**1. 각 패키지에 대한 디렉토리**

* `install` 폴더 내에는 워크스페이스의 각 패키지마다 개별 디렉토리가 생성된다.
* 예를 들어, `my_robot_package`라는 패키지가 있다면, `install/my_robot_package` 폴더에 이 패키지의 실행 파일, 라이브러리, 메시지 정의 파일 등이 설치된다.
* 이 디렉토리 구조 덕분에 패키지를 개별적으로 관리하고, ROS2 런타임에서 해당 패키지에 대한 리소스를 쉽게 찾을 수 있다.

**2. `setup.*` 파일들**

* **`setup.bash`, `setup.sh`, `setup.zsh`**: 워크스페이스 전체 환경을 설정하는 파일들이다. ROS2 패키지를 사용할 수 있도록 모든 환경 변수를 설정한다.
  * **사용법**: 워크스페이스 내 패키지를 실행하려면 이 파일들을 소싱하여 ROS2 환경을 로드해야 한다.
  * 예시:

    ```bash
    source install/setup.bash
    ```
* **`local_setup.*` 파일들**: 현재 워크스페이스만의 환경을 설정하는 파일들이다.
  * 다른 워크스페이스와 연관되지 않고 독립적으로 이 워크스페이스의 환경만 설정한다.
  * 예시:

    ```bash
    source install/local_setup.bash
    ```

**3. `share` 디렉토리**

* 각 패키지의 **설정 파일과 리소스**가 저장된다. 주로 `launch` 파일, 파라미터 파일, 메시지 정의 파일들이 포함된다.
* **위치**: `install/share/<패키지_이름>/` 구조로 저장된다.
* ROS2 런타임에서 `launch` 파일이나 설정 파일을 참조할 때 이 경로를 사용한다.

**4. `lib` 디렉토리**

* 빌드된 각 패키지의 실행 파일과 라이브러리 파일이 포함된다.
* 예를 들어, `my_robot_package`에서 생성된 실행 파일이나 `.so` 형식의 공유 라이브러리가 `install/lib/my_robot_package/` 디렉토리에 저장된다.
* 이 디렉토리 내의 파일들은 ROS2 런타임에서 각 패키지를 실행할 때 참조된다.

#### `install` 폴더 관리

* `install` 폴더는 `colcon build` 명령어로 다시 빌드될 때마다 업데이트되므로, 문제 발생 시에는 `install` 폴더를 삭제하고 다시 빌드할 수 있다.

  ```bash
  rm -rf install/ build/ log/
  colcon build
  ```

이 `install` 폴더 구조는 ROS2 워크스페이스 내 패키지를 효율적으로 설치, 실행, 관리할 수 있도록 해 준다.

### install 폴더의 `local_setup.*`와 `setup.*`의 차이

ROS2의 `install` 디렉토리 내에는 `local_setup.*` 및 `setup.*` 파일들이 있다. 이 두 파일은 ROS2 워크스페이스와 패키지를 설정하는 데 사용되지만, 그 용도와 범위가 약간 다르다.

#### `setup.*` 파일

* **역할**: 워크스페이스의 모든 ROS2 환경 설정을 포함하여, 이 워크스페이스에 의존하는 다른 워크스페이스에서도 설정을 사용할 수 있도록 해 준다.
* **용도**: 다른 상위 워크스페이스에서 이 워크스페이스의 환경을 사용할 때 `setup.bash`를 소싱한다.
* **내용**: 현재 워크스페이스뿐 아니라, 이 워크스페이스와 연결된 다른 워크스페이스의 환경 설정 정보까지 포함한다.

예를 들어, 여러 ROS2 워크스페이스를 계층적으로 사용할 때, 최상위 워크스페이스의 `setup.bash` 파일만 소싱하면 모든 하위 워크스페이스의 설정을 적용할 수 있다.

```bash
source /home/bijung/ros2_ws/install/setup.bash
```

#### `local_setup.*` 파일

* **역할**: 현재 워크스페이스의 환경만 설정한다.
* **용도**: 다른 워크스페이스에 영향을 주지 않고, 현재 워크스페이스의 설정만을 적용할 때 사용한다.
* **내용**: 현재 워크스페이스의 경로와 환경 변수만 설정하며, 이 워크스페이스에 의존하지 않는 다른 워크스페이스는 설정되지 않는다.

예를 들어, 이 워크스페이스만 독립적으로 설정하려면 다음과 같이 `local_setup.bash` 파일을 소싱한다.

```bash
source /home/bijung/ros2_ws/install/local_setup.bash
```

#### 사용 예시와 권장 방법

1. **단일 워크스페이스 사용 시**:
   * 이 경우 `setup.bash`나 `local_setup.bash` 중 아무거나 소싱해도 동일한 효과를 얻을 수 있다.
2. **다중 워크스페이스 계층 사용 시**:
   * 상위 워크스페이스에서는 `setup.bash` 파일을 소싱하여 모든 하위 워크스페이스의 설정을 한 번에 적용하는 것이 편리한다.
   * 특정 하위 워크스페이스의 설정만 사용하고 싶다면, 해당 워크스페이스의 `local_setup.bash`를 소싱한다.

따라서 일반적으로 여러 워크스페이스가 연결된 경우에는 상위 워크스페이스의 `setup.bash`를 소싱하여 전체 환경을 설정하는 것이 일반적이다.

### build 폴더

`build` 폴더는 ROS2 워크스페이스에서 **패키지를 빌드할 때 생성되는 임시 파일**과 **중간 파일**들이 저장되는 디렉토리이다. 이 폴더는 ROS2에서 `colcon build` 명령어를 실행할 때 자동으로 생성되며, ROS2가 패키지를 컴파일하고 연결하는 과정에서 필요한 빌드 아티팩트를 저장한다.

#### `build` 폴더의 주요 역할

* **컴파일된 개별 패키지 파일 저장**: 각 패키지의 소스 코드가 컴파일되면서 생성되는 중간 파일들이 저장된다.
* **CMake 및 ament 빌드 설정 파일**: ROS2에서 사용하는 `CMake`와 `ament` 빌드 시스템의 설정 파일 및 의존성 정보가 포함된다.
* **빌드 캐시**: 이미 빌드된 파일을 재사용하기 위한 캐시가 저장되어 있어, 변경되지 않은 파일은 다시 빌드하지 않고 효율적으로 빌드할 수 있다.

#### `build` 폴더의 구성 요소

`build` 폴더에는 각 패키지별로 디렉토리가 생성되며, 각 디렉토리에는 해당 패키지의 빌드와 관련된 다양한 중간 파일과 설정 파일이 포함된다.

**1. 패키지별 디렉토리**

* `build/<패키지_이름>/` 형태로 패키지별 디렉토리가 생성된다.
* 이 디렉토리 안에는 컴파일 중 생성되는 `.o` 파일, CMake 설정 파일, 빌드 로그 등이 포함된다.
* 예를 들어, `my_robot_package` 패키지를 빌드하면 `build/my_robot_package/` 디렉토리에 해당 패키지의 빌드 관련 파일들이 저장된다.

**2. CMake 및 ament 빌드 설정 파일**

* ROS2는 CMake와 ament 빌드 시스템을 사용하므로, `build` 폴더 내에 `CMakeCache.txt`, `CMakeFiles/`, `Makefile` 등 CMake 빌드 관련 파일들이 생성된다.
* 이 파일들은 패키지의 빌드 설정을 저장하고, 컴파일 과정에서 참조된다.

**3. 빌드 로그 파일**

* `build` 폴더에는 빌드 과정 중 발생하는 로그 파일도 포함된다.
* 이러한 로그 파일들은 빌드 중 오류가 발생했을 때 문제를 진단하는 데 유용하다.

#### `build` 폴더 관리

`build` 폴더는 빌드 중 생성되는 임시 파일과 중간 파일을 포함하므로, 문제 발생 시 **삭제해도 안전**한다. 필요에 따라 `build` 폴더를 삭제하고 깨끗한 빌드를 수행할 수 있다.

**`build` 폴더 삭제 및 재빌드**

1. **`build` 폴더 삭제**:

   ```bash
   rm -rf build/
   ```
2. **깨끗한 빌드 수행**:

   ```bash
   colcon build
   ```

이 과정을 통해 이전 빌드 파일과 캐시를 제거하고, 새롭게 빌드를 시작할 수 있다.
