ROSをcolconでビルドしたときにCLionでコード補完をする


はじめに

ROSの開発では、C++を主に使いますが、みなさんはIDEを使用されているのでしょうか?わたしは、C++以外にもAWS lambdaではpython、AWS CDKではnode、業務アプリケーションでは、ScalaやSQLを書く必要があり、それらを1箇所で管理するために JetBrains CLion が非常に都合が良いため、購入して使用しています。

ROSのビルドをcatkinで行っていたときは、トップレベルにメタパッケージとなるCMakeファイルを配置すればコードの補完では問題ありませんでしたが、AWS Robomakerを使用するにあたってcolconでビルドする必要があり、これまでは colcon build して install 配下に生成されたパッケージ全てに対してCLionのCMakeオプションで CMAKE_PREFIX_PATH に全てのパスを追加して補完をしていましたが、カスタムメッセージが認識できなかったり、1つのCMakeをロードすると異なるパッケージの参照ができなくなり、複数同時に開発する時に効率を上げるのが難しい状態でした。

そのため今回は、compile_commands.jsonを生成し、こちらをCLionで読み込む方法をまとめました。

colcon-cmakeの対応を調べる

ワークスペースレベルでのcompile_commands.jsonの生成は、こちらのPRですでにマージされています。ただしこれは、colcon-cmake >= 0.2.20 です。

そのため、まずはすでにインストールしているcolcon-makeのバージョンを確認します。

$ pip3 list | grep colcon

バージョンが 0.2.19 のため、まずはこちらをアップグレードします。

$ sudo apt update
$ pip3 install --upgrade colcon-common-extensions colcon-ros-bundle
$ pip3 list | grep colcon

0.2.25 になり使用することができるようになりました。

CLionの設定

clangdの設定

つぎにCLionのclangdの設定を確認します。2020.2より前のバージョンだと、ビルドインclangdバージョンの表記はありませんでした。

ここでは、最新にアップグレードしました。

CLionの最適化設定

最新にアップグレードすると、これまでの最適化設定が効かなくなっていましたので、下記を参考に設定します。

colconでビルドする

colconでビルド時に必要な設定は、CMakeのオプションをつけるだけです。

$ colcon build --cmake-args=-DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON
$ ls -la build/compile_commands.json 
-rw-r--r-- 1 wnwn wnwn 31714  8月 24 13:14 build/compile_commands.json

これでcompile_commands.jsonが生成されていることが確認できました。

CLionのプロジェクト設定

次に生成したcompile_commands.jsonをCLionのcompilation databaseに読み込みを行います。

すでにプロジェクトを開いている場合は、一度閉じて生成したcompile_commands.jsonを選択します。

このときプロジェクトルートが、build配下となってしまいますので、src/my_projectに設定をします。

また、terminalのデフォルトパスもbuildになってしまいましたので、ワークスペース直下に設定しなおしました。

この時にgitリポジトリも認識されなくなってしまったので、手動で再度認識させなおしました。

これでセットアップは終了です。

コード補完の確認をする

すでに補完ができる状態になっているため、ファイルを開きます。これまでは複数パッケージをまたいで補完はできていませんでしたが、前述の設定でできていることを確認することができます。

またcompilation databasecompile_commands.jsonの自動読み込み設定が有効になっているため、colconで--packages-selectを用いてビルドした場合は、ビルドしたパッケージだけの補完になっていることが確認できます。

まとめ

  • ROSをcolconでビルドした時にCLionでコード補完ができた
  • ロボット開発をするときにいくつもの異なる言語やシステムをまたぐ必要があるため、CLionのようなIDEをうまく使うと開発効率を上げることができる