# 워크스페이스 생성 및 빌드 시스템 설정

ROS2 프로젝트는 워크스페이스 구조를 기반으로 구성된다. 각 패키지는 워크스페이스 내에서 독립적으로 관리되며 `colcon` 빌드 시스템을 사용하여 빌드된다.

#### 워크스페이스 초기화

**1. 워크스페이스 디렉토리 생성:**

```bash
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
```

**2. 워크스페이스 빌드:**

```bash
colcon build --symlink-install
```

**3. 빌드 삭제**

```sh
rm -rf build/ install/ log/
```

#### 패키지 생성 및 구조 이해

ROS2 프로젝트는 패키지 단위로 나누어지며, 각 패키지는 특정 기능을 담당한다. 패키지를 생성하여 노드를 작성하고 필요한 메시지 인터페이스를 정의할 수 있다.

**ROS2 패키지 생성**

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

이 명령은 `ament_cmake` 빌드 유형을 사용하여 `my_autonomous_robot` 패키지를 생성하며, 기본적인 디렉토리와 파일 구조를 포함한다.

패키지 생성 후에는 `CMakeLists.txt`와 `package.xml` 파일이 생성되며, 이는 패키지의 빌드 및 의존성을 관리하는 데 사용된다.

#### ROS2 패키지 구조

ROS2에서 각 패키지는 자율주행 로봇의 특정 기능을 독립적으로 관리하고, 노드, 메시지, 서비스 등을 통해 통신한다. ROS2 패키지는 표준화된 구조로 설계되어 있으며, 아래와 같은 디렉토리와 파일들로 구성된다.

**기본 디렉토리와 파일 구조**

1. **package.xml**
   * ROS2 패키지의 메타데이터를 포함하는 파일이다. 이 파일에는 패키지 이름, 버전, 설명, 라이센스 정보, 의존성 목록 등이 명시된다.
   * 주요 의존성은 `<depend>` 태그로 정의되며, 빌드, 실행 시 필요한 라이브러리 및 다른 패키지 의존성을 지정한다.
2. **CMakeLists.txt**
   * 패키지의 빌드 설정을 관리하는 파일로, `ament_cmake`와 같은 빌드 시스템이 사용하는 명령어가 포함된다.
   * `add_executable` 명령어를 통해 노드 실행 파일을 지정하고, `install` 명령을 통해 빌드 후 설치 경로를 설정한다.
   * 예시:

     ```cmake
     cmake_minimum_required(VERSION 3.5)
     project(autonomous_robot)

     find_package(ament_cmake REQUIRED)
     find_package(rclcpp REQUIRED)
     find_package(geometry_msgs REQUIRED)

     add_executable(velocity_publisher src/autobot.cpp)
     ament_target_dependencies(velocity_publisher rclcpp geometry_msgs)

     install(TARGETS
       velocity_publisher
       DESTINATION lib/${PROJECT_NAME})

     ament_package()
     ```
3. **src 디렉토리**
   * ROS2 노드의 소스 코드가 저장되는 디렉토리이다. 노드는 C++ 또는 Python으로 작성되며, 각 기능에 따라 분리된 파일로 구성된다.
   * 예를 들어, `autobot.cpp` 파일이 있다면, 이 파일에는 속도 제어 명령을 퍼블리시하는 로직이 포함된다.
4. **include 디렉토리**
   * 헤더 파일을 저장하는 디렉토리이다. 주로 C++로 작성된 패키지에서 사용되며, 프로젝트의 공용 헤더 파일을 배치한다.
   * 복잡한 프로젝트의 경우 기능을 모듈화하기 위해 헤더 파일을 여러 개 작성하여 사용한다.
5. **launch 디렉토리**
   * ROS2 패키지의 실행 파일을 관리하는 `.launch.py` 파일이 포함된다. 각 노드를 실행하기 위한 설정을 정의하며, 다수의 노드를 한 번에 실행할 때 유용하다.
   * `launch` 파일은 Python 기반으로 작성되어 노드의 실행 순서, 파라미터 설정, 로그 수준 등을 정의할 수 있다.
6. **msg 및 srv 디렉토리**
   * 메시지(msg)와 서비스(srv) 타입을 정의하는 디렉토리이다.
   * `msg` 파일은 노드 간 데이터 교환 형식을 정의하며, 예를 들어 로봇의 위치 정보를 포함하는 메시지 타입을 정의할 수 있다.
   * `srv` 파일은 요청-응답 구조의 서비스를 정의하며, 예를 들어 특정 작업의 시작과 종료 요청을 처리하는 구조를 구현할 수 있다.

#### ROS2 패키지 구성 예시

아래는 ROS2 패키지의 구조 예시이다.

```plaintext
my_autonomous_robot/
├── CMakeLists.txt
├── package.xml
├── src/
│   ├── velocity_publisher.cpp
│   └── control_node.py
├── include/
│   └── autobot_robot/
│       └── control.hpp
├── launch/
│   └── robot_launch.launch.py
├── msg/
│   └── Position.msg
└── srv/
    └── ResetOdometry.srv
```

각 파일과 디렉토리는 자율주행 로봇 프로젝트의 다양한 기능을 모듈화하여 관리하는 데 사용된다.

**launch 파일 예시**

아래는 두 개의 노드를 동시에 실행하는 `launch` 파일의 예시이다.

```python
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='autonomous_robot',
            executable='velocity_publisher',
            name='velocity_publisher'
        ),
        Node(
            package='autonomous_robot',
            executable='control_node',
            name='control_node'
        )
    ])
```

이 `launch` 파일을 통해 `velocity_publisher`와 `control_node` 두 개의 노드를 동시에 실행할 수 있다. 이를 통해 자율주행 로봇의 속도 제어와 경로 제어를 통합하여 관리할 수 있다.

#### ROS2에서 패키지 확인 방법

ROS2에서 특정 패키지가 존재하는지 확인하려면 다음 명령어들을 사용할 수 있다.

#### 1. `ros2 pkg list` 명령어 사용

ROS2의 모든 패키지를 목록으로 출력하여 특정 패키지가 존재하는지 확인할 수 있다.

```bash
ros2 pkg list | grep <패키지_이름>
```

예를 들어, `my_robot_package`라는 패키지가 설치되어 있는지 확인하려면:

```bash
ros2 pkg list | grep my_robot_package
```

이 명령어는 패키지 목록에서 `my_robot_package`라는 이름을 가진 패키지를 검색한다. 해당 패키지가 설치되어 있으면 출력에 나타나고, 없으면 결과가 표시되지 않는다.

#### 2. `ros2 pkg prefix` 명령어 사용

`ros2 pkg prefix` 명령어를 사용하면 특정 패키지의 설치 경로를 확인할 수 있다. 패키지가 존재하지 않으면 오류 메시지가 표시된다.

```bash
ros2 pkg prefix <패키지_이름>
```

예를 들어:

```bash
ros2 pkg prefix my_robot_package
```

이 명령어는 `my_robot_package`의 설치 경로를 출력하며, 패키지가 존재하지 않으면 다음과 같은 오류 메시지가 표시된다.

```plaintext
Package 'my_robot_package' not found
```

#### 3. `colcon list` 명령어 사용 (소스 워크스페이스에서)

소스 워크스페이스 내에서 패키지를 빌드하기 전 `colcon`을 사용해 확인할 수도 있다. 이 방법은 주로 워크스페이스 내부의 패키지를 확인하는 데 유용하다.

```bash
colcon list | grep <패키지_이름>
```

위 방법들을 통해 ROS2에서 특정 패키지가 설치되었는지 확인할 수 있다.
