ROS2 VSCode Debug 설정하는 방법

ROS2 VSCode Debug 설정하는 방법

Ubuntu에서 ROS 패키지 디버깅 설정하기

WSL을 통해서 주로 작업하다보니 대략적인 내용은 print로 작업하는게 익숙한가 봅니다. 뭔가 Linux 계열의 OS에서 디버그하는 방법이 뭔가 싶은데 마땅한 최근 자료가 없는 것 같아서 한 번 작성해보려고 합니다.

우선 Ubuntu OS 기반에서 테스트 한다는 점 이야기하고 시작하겠습니다.

동일하게 WSL에서 Ubuntu를 하는 것과 노트북에서 더블OS(Window / Ubuntu)를 통해 Ubuntu에서 하는 것을 두고 봤을 때 가상 환경의 차이인지(OS 지식이 부족해 확실하지 않습니다) 동일하게 json을 설정해도 Ubuntu OS에서는 간단하게 동작합니다.

오히려 WSL에서 어떻게든 해보겠다고 끙끙 앓는 것보다 Ubuntu에서 테스트해보면서 차선책을 살펴봤으면 좋았을텐데 늘 효율적인 선택을 이렇게 못하는지 제 자신에게 화가 나는군요.

우선 ROS를 하시면서, 소스코드를 직접 수정하고 본인만의 ROS 패키지 또는 ROS 메세지를 작성해보신다면 VSCode가 가장 적절한 개발환경 도구일 겁니다.

그래서 해당 글은 Ubuntu에서 VScode를 통하여 ROS2 특정 패키지를 디버깅하는 방법을 소개하려고 합니다.

Ubuntu에서 VSCode 설치하기

저의 경우 디버깅하려고 한다면 노트북을 따로 사용해서 테스트합니다. 노트북에 Ubuntu(.amd)를 설치하여 더블 OS로 사용하고 있죠.

노트북에 설치된 환경은 아래와 같습니다.

  • Ubuntu 22.04
  • ROS2 Humble

👉VSCode 설치하기

위의 사이트에 접속해서 .deb 파일을 다운로드 받도록 하세요.

VSCode 홈페이지

sudo apt install ./파일명

이렇게 직접 설치를 진행하시고, 터미널 창에 ‘code’를 입력하거나 GUI에서 VSCode를 클릭하셔서 실행해주도록 합니다.

VSCode가 실행되면 좌측 상단에 [File] - [Open Folder…] 순으로 여시고 디버깅 원하는 워크스페이스 경로를 택해주도록 합시다.

Open Folder 탭클릭 Open Folder 창

저는 realsense 소스코드를 디버깅해보겠습니다.

~/realsense_ws/src/ 디렉토리에 git clone으로 ROS2 humble 버전에 맞춰 설치해둔 상황입니다.

[Open Folder]를 통해 폴더를 열면 아래와 같이 ‘.vscode’폴더가 생성되어 c_cpp_properties.json과 settings.json이 배치됩니다. 여기에 ROS 코드 디버깅을 위해 launch.json을 생성해주도록 하겠습니다.

vscode 폴더 생성

launch.json의 작성 내용은 python과 C++로 디버깅하는 것입니다. 작성 내용은 아래와 같으며 좀 더 자세한 구성은 아래의 페이지를 참고하시길 바랍니다.

👉ROS2 개발 환경 구축(네이버 오로카 카페)

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug-rclpy(debugpy)",
      "type": "python",
      "request": "launch",
      "program": "${file}",
      "console": "integratedTerminal"
    },
    {
      "name": "Debug-rclcpp(gbd)",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/install/${input:package}/lib/${input:package}/${input:node}",
      "args": [],
      "preLaunchTask": "colcon: build",
      "stopAtEntry": true,
      "cwd": "${workspaceFolder}",
      "externalConsole": false,
      "MIMode": "gdb",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ]
    }
  ],
  "inputs": [
    {
      "id": "package",
      "type": "promptString",
      "description": "package name",
      "default": "realsense2_camera"
    },
    {
      "id": "node",
      "type": "promptString",
      "description": "node name",
      "default": "argument"
    }
  ]
}

위의 launch.json만 추가해줌으로써 ROS 코드 디버깅이 가능해집니다. 디버깅 타입은 python과 cppdbg로 구분되며, 디버깅마다 package, 노드 이름을 입력해야 하는데 이는 “input”에서 default를 미리 설정해두시면 바로 진행되니 특정 워크스페이스의 폴더에 맞춰 launch.json을 추가해서 사용하시면 될 것 같습니다.

launch.json 작성

Ctrl + Shift + D 단축키를 입력하거나 좌측에 Run and Debug를 클릭해서 창을 열도록 합니다. 그럼 아래와 같이 launch.json에 작성해두었던 ‘Debug-rclpy’와 ‘Debug-rclcpp’ 2가지 목록이 추가된 걸 확인하실 수 있습니다.

Run and Debug 실행

저는 C++ 소스코드를 디버깅할 것이니 Debug-rclcpp를 클릭해 진행해 보겠습니다.

패키지 이름 -> 노드 이름 순으로 입력하라고 상단에 창이 뜨게 될 겁니다. 본인이 작업하려는 패키지에 맞춰 입력해주시면 됩니다. 패키지 이름을 잘 모르겠다면 package.xml 파일에 작성된 태그를 확인하시면 됩니다.

패키지 이름 입력 노드 이름 입력

그리고 저는 ‘base_realsense_node.cpp’의 특정 라인에 중단점을 지정해두고 디버깅을 하는 것입니다. 다른 IDE를 통해 디버깅을 해보셨다면 동일하게 동작한다고 보시면 됩니다!

중단점 지정

패키지, 노드 이름 입력을 완료하면(Enter 입력) 빌드가 진행됩니다. 구성된 패키지가 복잡하고 양이 많다면 조금 주의가 필요할 수도 있을 것 같습니다.

빌드 진행

빌드가 마무리되면 아래와 같이 main문의 첫 라인에 맞춰 프로세스가 멈출 겁니다. 나머지 과정은 Visual Studio에서 디버깅하는 것과 유사합니다.

디버깅 진행

특정 함수 내부에서 순차적으로 진행할 수도 있고, 아까 제가 설정해둔 중단점으로 바로 넘어가기도 하고 원하시는 바에 맞춰 디버깅을 진행하시면 되겠습니다.

init_and_remove_ros_argument() 함수 내부의 시퀀스를 동작해보려면 F11 단축키를 눌러서 아래와 같이 하나씩 살펴볼 수 있습니다.

함수 내부 디버깅

그 외에도 변수 및 전역, 메모리 변화 등을 좌측 탭을 통해 확인해볼 수 있습니다. 부끄럽게도 Ubuntu 쪽에선 디버깅을 사용할 일이 거의 없어서 이제서야 하나둘씩 적응 중입니다. 혹시나 VSCode로 디버그를 어떻게 하는지 막막하신 분들은 참고가 되었으면 합니다.