Yura YuLife

ITエンジニアの覚え書き。

ROS開発にPyCharmやCLionを使う際のTips

この記事では ROS の開発に Jetbrains 製の IDE である PyCharm や CLion を使う際に、便利に開発を進めるための設定を紹介しています。

環境

  • Ubuntu 16.04 (14.04)
  • ROS Kinetic (Indigo)
  • PyCharm 2016.X
  • CLion 2016.X

環境変数を設定

Ubuntu にインストールした PyCharm や CLion をランチャーから起動すると、ROS の環境変数が読み込まれておらず、ROSの関数やメッセージを import / include すると not found とワーニングが表示されます。

そこで、ROSの環境変数を読み込んだターミナルから IDE を起動してあげることで、メッセージや関数が正しく補完されるようになります。

$ source /opt/ros/kinetic/setup.bash  # ROS Kinetic の場合
$ source /opt/ros/indigo/setup.bash   # ROS Indigo の場合
$ source ~/catkin_ws/devel/setup.bash
$ clion &  # CLion をバックグラウンドで起動
$ charm &  # PyCharm をバックグラウンドで起動

追記(2016/10/27)

以下のように Unity の launcher ファイルを書き換えることで、シェルから IDE を立ち上げる必要がなくなります。

PyCharmの場合 ~/.local/share/applications/jetbrains-pycharm.desktop CLionの場合 ~/.local/share/applications/jetbrains-clion.desktop

[Desktop Entry]
Version=1.0
Type=Application

...

# 以下の行を削除
Exec=bash -c "/path/to/your/clion/bin/pycharm.sh %f"  # PyCharm
Exec=bash -c "/path/to/your/clion/bin/clion.sh %f"  # CLion

# 以下の行を追記する(PyCharm, ROS Kinetic の場合)
Exec=bash -c "source /opt/ros/kinetic/setup.bash; source /path/to/your/catkin_ws/devel/setup.bash; /path/to/your/pycharm/bin/pycharm.sh" %f

# 以下の行を追記する(CLion, ROS Kinetic の場合)
Exec=bash -c "source /opt/ros/kinetic/setup.bash; source /path/to/your/catkin_ws/devel/setup.bash; /path/to/your/clion/bin/clion.sh" %f

...

型ヒントを利用 (PyCharm)

Python の docstring に変数や戻り値の型を記述すると、PyCharm がメンバ変数の補完や型の誤りの指摘をしてくれます。

例えば、PoseStamped 型のトピックのコールバック関数を例に取るとこんな感じです。

import math

import rospy
from geometry_msgs.msg import PoseStamped

def callback_pose(pose):
    u""" PoseStamped のトピックのコールバック

    :param geometry_msgs.msg.PoseStamped pose: 変数 pose に関する説明
    :rtype: float  # 関数の戻り値の型
    :return: pose の原点からの距離  # 関数の戻り値の説明
    """
    # pose. と打つと pose を補完、 pose.pose と打つと position や orientation を補完してくれる
    position = pose.pose.position
    distance = math.sqrt(position.x ** 2 + position.y ** 2 + position.z ** 2)
    return distance


rospy.Subscriber("/some/topic", PoseStamped, callback_pose)

ROS の Pose 型と PoseStamped 型などは間違いやすいうえ、Python だと実行するまで気づけなかったりするので、PyCharm の type hinting を活用するとミスが減って効率アップできます。

参考URL