# Visual Studio Code 및 JetBrains 툴 세팅

ROS2 Humble 기반의 개발 환경을 구축할 때, **IDE(Integrated Development Environment)** 선택은 매우 중요하다. 이 장에서는 대표적으로 많이 사용되는 **Visual Studio Code**(이하 VS Code)와 **JetBrains** 계열 IDE(대표적으로 CLion)에서의 ROS2 Humble 개발 환경 설정 방법을 다룬다. ROS2는 C++과 Python을 주력으로 하기 때문에, 두 언어에 대한 추가 설정 또한 함께 살펴볼 것이다.

#### 사전 준비 사항

* ROS2 Humble이 정상적으로 설치되어 있어야 한다.
* 시스템 환경 변수에 ROS2 관련 경로가 올바르게 설정되어 있어야 한다.
* C++11 이상의 컴파일러와 Python 3.x가 설치되어 있어야 한다.

```bash
# 예: ROS2 설치 완료 여부 확인
printenv | grep -i ROS
```

#### VS Code 설치 및 기본 설정

* **다운로드 및 설치** VS Code는 [공식 웹사이트](https://code.visualstudio.com/)에서 설치 파일을 다운받아 쉽게 설치할 수 있다.
* ROS2용 확장 프로그램(Extension) 설치

  ROS2 개발 편의를 위해 다음과 같은 확장 프로그램 설치를 권장한다.

  1. C/C++ by Microsoft
  2. Python
  3. ROS (ms-iot.vscode-ros)
  4. CMake Tools (ms-vscode.cmake-tools)
  5. IntelliSense 설정 최적화용 확장(예: `clangd`, `cpptools-extension-pack` 등)

```bash
# VS Code 내 터미널에서 (또는 GUI Extension 탭에서) 확장 프로그램 설치
code --install-extension ms-iot.vscode-ros
code --install-extension ms-vscode.cmake-tools
...
```

#### VS Code 환경변수 설정

ROS2 환경을 사용하기 위해서는 VS Code 내에서 ROS2 스크립트를 매 세션마다 자동으로 실행하거나, 별도의 쉘(task)을 설정해야 한다. 대표적으로 아래와 같은 방법으로 설정할 수 있다.

**시스템 환경 변수에 추가**: 로컬 시스템의 `~/.bashrc` 또는 `~/.zshrc` 파일에 다음 라인을 추가한다.

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

이후 VS Code를 실행할 때마다 자동으로 ROS2 환경이 로드된다.

**VS Code 내 `settings.json` 설정**: 프로젝트 단위로 ROS2 Humble 환경을 적용하고 싶다면 `.vscode/settings.json` 내부에서 특정 쉘을 호출할 수 있도록 설정 가능하다.

```json
{
  "terminal.integrated.profiles.linux": {
    "ROS2Shell": {
      "path": "/bin/bash",
      "args": ["-i", "-c", "source /opt/ros/humble/setup.bash && exec bash"]
    }
  },
  "terminal.integrated.defaultProfile.linux": "ROS2Shell"
}
```

#### VS Code의 C++ 개발 설정

**IntelliSense 설정**

* **CMake Tools 사용** ROS2 프로젝트는 대개 CMake를 이용하여 빌드한다. VS Code에서 `CMake Tools` 확장을 활성화하면, CMakeLists.txt를 인식해 자동으로 구성(Configure)할 수 있으며, IntelliSense가 빌드 대상 디렉터리와 헤더 경로 등을 추적한다.

**빌드 및 디버그 구성**

빌드 스크립트 정의 `.vscode/tasks.json` 파일에 빌드, 클린, 테스트 등을 정의할 수 있다.

```json
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "build",
      "type": "shell",
      "command": "colcon build --merge-install",
      "group": "build"
    }
  ]
}
```

디버그 설정 `.vscode/launch.json` 파일에서 GDB나 LLDB 등을 이용한 디버그 구성을 할 수 있다.

```json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "ROS2 C++ Debug",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/install/my_package/lib/my_package/my_executable",
      "args": [],
      "cwd": "${workspaceFolder}",
      "environment": [],
      "MIMode": "gdb",
      "miDebuggerPath": "/usr/bin/gdb",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ]
    }
  ]
}
```

#### VS Code의 Python 개발 설정

ROS2 Humble에서 Python 노드를 작성할 때 VS Code를 사용하면 편리한 IntelliSense와 디버깅을 누릴 수 있다.

**Python Interpreter 지정**: 좌측 하단의 Interpreter 선택 메뉴에서 적절한 Python 버전(ROS2 Humble 지원 버전)을 지정한다.

**ROS2 Python 패키지 관리**: `$ colcon build` 시 Python 패키지가 `install/lib/python3.x/site-packages` 에 반영되는지 확인한다.

**Python 노드 디버깅**: `launch.json` 파일에서 Python 파일(예: `my_script.py`)을 직접 디버그하거나 ROS2 런치 파일로부터 호출되는 노드를 디버깅할 수 있다.

#### JetBrains CLion 설치 및 기본 설정

ROS2 C++ 프로젝트를 JetBrains CLion에서 진행하면, CMake 기반 빌드 시스템과 긴밀히 통합되어 편리하다.

**CLion 다운로드 및 설치**: JetBrains [공식 웹사이트](https://www.jetbrains.com/clion/)에서 설치 파일을 다운받는다.

**ROS2 플러그인(플러그인 마켓플레이스)**: 공식 ROS 플러그인이 존재하지 않을 수도 있지만, ROS1 관련 플러그인을 설치한 뒤 구성 파일을 약간 변경하여 ROS2 환경에 맞출 수 있다.

**시스템 환경 로드**: CLion이 기본 쉘 환경을 그대로 로드하도록 설정하면, `source /opt/ros/humble/setup.bash` 가 자동으로 적용된다.

```bash
# CLion 실행 전 환경 설정
source /opt/ros/humble/setup.bash
clion
```

#### JetBrains 환경에서 CMake 설정

**CMake Profiles**: CLion은 "프로파일(Profile)"을 이용해 빌드 설정을 구분한다. 예를 들어 `Debug`, `Release` 등으로 분리 가능하다.

**Toolchains**: ROS2가 제공하는 cross-compile 툴체인 등을 적용해야 하는 경우, CLion에서 `Settings > Build, Execution, Deployment > Toolchains` 메뉴에서 해당 툴체인을 설정한다.

#### JetBrains Python 개발 환경

JetBrains 계열에서 Python 프로젝트를 진행할 때는 **PyCharm**을 사용할 수 있다. PyCharm은 Python 개발에 특화되어 있으며, ROS2 Python 노드 구현 및 디버깅에도 유용하다.

**Interpreter 설정**: PyCharm에서

```
$ source /opt/ros/humble/setup.bash
```

로드 이후, Python 인터프리터를 설정해야 한다.

1. `Preferences (Settings) > Project > Python Interpreter` 메뉴 진입
2. 시스템 Python 혹은 가상 환경(venv)을 지정하되, ROS2 설치 경로에 맞춰 라이브러리가 인식되는지 확인

* **ROS2 Python 패키지 구조 인식** colcon 빌드 시 생성되는 ROS2 패키지 구조(예: `install/lib/python3.x/site-packages`)를 PyCharm에서 프로젝트 루트로 추가해주면, 코드 자동 완성 및 에러 검사 등을 정확하게 활용할 수 있다.
* **ROS2 런치 파일 연동** 실제 실행은 ROS2 런치 파일(예: `.launch.py`)을 통해 이루어질 수 있으므로, PyCharm의 **Run/Debug configurations** 메뉴를 활용하여 해당 런치 파일을 호출하도록 설정할 수 있다.
* **디버깅** PyCharm은 로컬 Python 노드를 직접 디버깅 가능하며, Launch 파일 실행 시에도 특정 프로세스를 디버깅 모드로 실행하게끔 구성할 수 있다.

#### JetBrains 환경에서 Remote Development

원격 시스템(예: NVIDIA Jetson, Raspberry Pi 등)에서 ROS2 Humble을 동작시키고, JetBrains 툴(예: CLion, PyCharm)로 원격 개발하는 방법도 있다.

1. **SSH 연결 설정** JetBrains IDE 상에서 `Tools > Deployment > Configuration` 또는 `Settings > Build, Execution, Deployment > Deployment` 메뉴에서 SSH 접속을 위한 호스트 정보를 입력한다.
2. **프로젝트 동기화** 원격 호스트에 존재하는 ROS2 워크스페이스와 로컬 프로젝트를 동기화하여, JetBrains IDE가 원격 환경의 라이브러리, 헤더, 패키지 구조 등을 제대로 인식하도록 한다.
3. **원격 빌드 및 디버그** 빌드는 원격 호스트에서 이뤄지되, JetBrains IDE의 디버거를 통해 원격 프로세스를 제어할 수 있다. GDB Server나 LLDB Server 모듈이 필요할 수 있으니, 환경에 맞춰 사전 설정이 요구된다.

#### Docker 환경과 VS Code/JetBrains 연동

ROS2 Humble을 Docker 컨테이너 내에서 구동하고, IDE로 접속하여 개발하는 경우도 많다.

**Dockerfile 예시**: 다음은 ROS2 Humble을 기반으로 하는 간단한 Dockerfile 예시다.

```dockerfile
FROM ubuntu:22.04

# 필수 패키지 설치
RUN apt-get update && apt-get install -y curl gnupg2 lsb-release

# ROS2 저장소 추가 및 설치
RUN echo "deb [trusted=yes] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" > /etc/apt/sources.list.d/ros2-latest.list
RUN apt-get update && apt-get install -y ros-humble-desktop

# COLCON, VCSTOOL 등 빌드 툴 설치
RUN apt-get install -y python3-colcon-common-extensions python3-vcstool

# bashrc 설정
RUN echo "source /opt/ros/humble/setup.bash" >> /root/.bashrc
```

**컨테이너 실행 후 IDE 연결**:

1. VS Code:
   * VS Code의 **Remote - Containers** 확장(또는 Dev Containers)을 통해 로컬 Docker 컨테이너 안에서 직접 개발이 가능하다.
   * 프로젝트 폴더를 컨테이너 내부로 마운트하고, `/root/.bashrc` 혹은 기타 쉘 스크립트를 통해 ROS2 환경을 로드한다.
2. JetBrains:
   * Remote Development 기능을 이용하거나, Docker 기반 툴체인을 설정해 빌드할 수 있다.
   * Docker 내 SSH Daemon을 띄운 뒤, CLion 혹은 PyCharm에서 SSH 연결로 접속하면, 로컬-원격 간 동기화 작업 없이도 IDE 기능을 활용할 수 있다.

#### Git 연동

ROS2 Humble 프로젝트를 진행하면서 **버전 관리**는 필수적이다. VS Code와 JetBrains 모두 Git 연동을 간편하게 제공한다.

* VS Code:
  * **Source Control** 탭 활용
  * GitLens, Git History 등 확장 프로그램 설치 시 다양한 히스토리 추적, 그래프, Blame 기능 등을 제공
* JetBrains IDE:
  * IDE 내부 `Version Control` 패널에서 Git(또는 다른 VCS)을 바로 설정 가능
  * 브랜치 관리, 충돌 해결, 리베이스, 체리픽 등 고급 기능을 GUI로 지원

```bash
# 새 저장소 초기화 예시
git init
git add .
git commit -m "Initial commit"
```

#### CI/CD(Continuous Integration/Continuous Deployment) 환경 설정

협업 규모가 커지면, **GitHub Actions**, **GitLab CI**, **Jenkins** 등을 통해 ROS2 Humble 빌드와 테스트 프로세스를 자동화할 수 있다.

* **ROS2 빌드 테스트** CI/CD 파이프라인에서 Docker 컨테이너(위 Dockerfile 예시와 유사)를 이용해 ROS2 환경을 구성하고, `colcon build` 및 단위 테스트를 자동으로 실행한다.
* **테스트 리포트** 빌드 성공 여부, 코드 커버리지 보고 등을 CI/CD 로그에 출력하거나, 별도의 HTML 보고서로 생성해 협업자들이 확인 가능하도록 한다.
