概要
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
- 左側のメニューのデバッグを開きます。
- 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
この状態で、デバッグの開始を行い、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が関連しているかもしれません。
その他
launch.jsonがすでにある場合で、AttachやLaunchを作成する場合は、launch.jsonを開き、右下の構成の追加でROSと入力するとROS: AttachやROS: Launchが表示されるのでそれを選ぶと構成を追加することもできます。
コメント