ROS 2のプログラムをVS Codeでデバッグする方法

ROS

概要

VS Codeを使用してROS 2のプログラムをデバッグする方法を記載します。printデバッグでは限界で、ブレークポイントでデバッグしたい箇所に止めて、ステップ実行しながら変数の値を確認したいという方はご参考ください。

前提条件

  • ROS 2 Humbleインストール済み
  • VS Codeインストール済み

環境インストール

  • VS Codeの拡張機能からROSを検索してインストールします。

  • 同様に、C++, Pythonの拡張機能もインストールします。

  • 今回デバッグ方法を試すためのC++とPythonのサンプルソースコードをGitHubにPushしていますので、以下のコマンドで取得しビルドします。(colcon_wsはご自身のworkspaceに置き換えていただければ大丈夫です)
cd ~/colcon_ws/src/
git clone https://github.com/remix-yh/ros_vscode_debug_practice.git

デバッグ方法

デバッグの方法は大きくlaunchデバッグattachデバッグの2種類があります。

launchデバッグは、ROS 2のlaunchファイルを実行するとともに、デバッグを行うためのプログラム(デバッガ)を起動します。この方法は、プログラムの開始から終了までデバッグするのに役立ちます。

attachデバッグは、launchデバッグが起動からデバッグできるのに対して、attachデバッグはすでに実行中のプロセスにデバッガをアタッチする方法です。この方法は、プログラムが実行中であるか、特定の状態にある場合に、その実行を一時停止し、デバッグ情報を検査するのに役立ちます。

Launchデバッグ(C++)

  • workspaceをVS Codeで開きます。

ターミナルを開き、ビルドを行います。

cd ~/colcon_ws/
colcon build --cmake-args -DCMAKE_BUILD_TYPE=RelWithDebInfo
C++の実行可能ファイルをデバッグする場合、デバッグを行うための情報(デバッグシンボル)を含むようにビルドする必要があります。デバッグシンボルは、デバッガがソースコードと実行中のプログラムを関連付けるために必要です。(プログラムのどの行を実行しているのか紐づける情報)これを実現するためには、ビルド時に -DCMAKE_BUILD_TYPE=RelWithDebInfo のようなフラグを使用して、デバッグ情報を含めるように指定します。
  • 左側のメニューのデバッグを開きます。
  • launch.jsonファイルを作成しますを押下し、ROS > ROS: Launch > cpp_debug_practice  >  cpp_debug_practice.launch.pyを選択します。このcpp_debug_practiceとcpp_debug_practice.launch.pyは、実際にデバッグしたいROSのパッケージおよびlaunchファイルを指定します。

  • 以下のようなデバッグ用のlaunch.jsonファイルを作成されればOKです。

  • この状態で、実行とデバッグがROS: Launchを選択し、左上の緑の再生ボタンを押すと、launchファイルを実行し、デバッグをすることができます。この状態で、publisher_member_function.cppのtimer_callbackにブレークポイントを設定するとブレークし、ステップ実行などができます。

Unable to start debugging…とエラーがでる場合

WSL2上で動作させていて、以下のエラーが出る場合は、gdbをインストールしましょう。
Unable to start debugging. Launch options string provided by the project system is invalid. Unable to determine path to debugger. Please specify the “MIDebuggerPath” option.

sudo apt install gdb

参考URL
https://github.com/ms-iot/vscode-ros/issues/588

Launchデバッグ(Python)

基本的に、C++と同様です。launchファイルのtargetの部分を、python用のlaunchに変更します。

{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "ROS: Launch",
            "request": "launch",
            "target": "/home/remix/colcon_ws/install/py_debug_practice/share/py_debug_practice/launch/py_debug_practice.launch.py",
            "launch": [
                "rviz",
                "gz",
                "gzclient",
                "gzserver"
            ],
            "type": "ros"
        }
    ]
}

ビルドを行います。

cd ~/colcon_ws/
colcon build --symlink-install
colcon build –symlink-installをつけている場合は、src/以下のpyファイルにブレークポイントを置けばブレークポイントで止めることができます。つけていない場合はinstall/以下のpyファイルなど、実行しているpyファイルを選択してブレークポイントを置く必要があります。

この状態で、デバッグの開始を行い、Pythonファイルにブレークポイントをつけると、ブレークポイントに止めることができます。

Attachデバッグ(C++)

基本的な流れはLaunchと同様です。

ターミナルを開き、ビルドを行います。

cd ~/colcon_ws/
colcon build --cmake-args -DCMAKE_BUILD_TYPE=RelWithDebInfo
  • 左側のメニューのデバッグを開きます。
  • launch.jsonファイルを作成しますを押下し、ROS > ROS: Attachを選択します。以下のようなlaunchファイルが作成されればOKです。
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "ROS: Attach",
            "request": "attach",
            "type": "ros"
        }
    ]
}
  • デバッグしたいノードを起動します。ここではtalkerを起動します。
ros2 run cpp_debug_practice talker
  • デバッグで、ROS: Attachを選択している状態で、左上の緑の再生ボタンを押します。C++を選択し、Attachしたいノードを検索して選択します。するとAttachすることができます。

  • Attachした状態でブレークポイントを押すと、ブレークポイントで止めて、デバッグできます。

Attachデバッグ(Python)

Pythonでのアタッチはうまくできずでした。以下のissueが関連しているかもしれません。

[bug] "Launch" works but "Attach" doesn't while debugging python node · Issue #872 · ms-iot/vscode-ros
Version Info Windows: (Version) Linux: Ubuntu OS 18.04.6 LTS ROS 1: Melodic ROS 2: Dist Visual Studio Code v1.75.0 VSCod...

その他

launch.jsonがすでにある場合で、AttachやLaunchを作成する場合は、launch.jsonを開き、右下の構成の追加でROSと入力するとROS: AttachやROS: Launchが表示されるのでそれを選ぶと構成を追加することもできます。

コメント