Python3のvirtualenvでrospyを使う


はじめに

ROS Advent Calendar 2019 23日目の記事です。
Python2のEOLまで残すところあと8日になりましたが、皆様Python3への以降はお済みでしょうか。
今回、ROS1のrospyをPython3のvirtualenvで実行できるようにしてみたので紹介したいと思います。

公式なROS1の rospy を使うためには、以下のような環境の制約があります。
 1. Ubuntuを使う
 2. ROSをインストールする
 3. システムにインストールされたPython2/ライブラリを使う

これは
 a. 既存のpipを使ったPythonプロジェクト(Python3)とROS1を共存させたい
 b. MacOSでrospyをちょっと試したい

のような場合には不便です。

解決方法として、roslibpyもありますが、rosbridgeで一度通信をwebsocketでブリッジするため、通信のオーバヘッドがかなりかかります。そこでrospy関係のROSのコードは、Pythonのみで書かれている事を利用し、純粋なPythonのパッケージとしてrospyをインストールできるPyPI(Python Package Index)を用意することで、Python3でもrospyを使えるようにしてみました。

使い方

以下の環境で確認しています。

  • OS: Ubuntu 18.04
  • Python: Python3.6.7

virtualenv を使う方法をサンプルで示します。ROSのインストールは不要です。
(pipenv等でも基本同じです)

virtualenv -p python3 venv
. ./venv/bin/activate
pip install --extra-index-url https://rospypi.github.io/simple rospy-all

TF2やcv_bridgeを使いたい場合は、さらに追加で

pip install --extra-index-url https://rospypi.github.io/simple cv_bridge tf2_ros

とするとできます。

以下のサンプルを用意し、

talker.py
import rospy
import std_msgs.msg

rospy.init_node("talker")
pub = rospy.Publisher("chat", std_msgs.msg.String, queue_size=1)
rate = rospy.Rate(2)
while not rospy.is_shutdown():
    pub.publish("hello")
    rate.sleep()
listner.py
import rospy
import std_msgs.msg

def callback(msg):
    print(msg.data)

rospy.init_node("listener")
rospy.Subscriber("chat", std_msgs.msg.String, callback)
rospy.spin()

rosmasterを追加でインストールします

pip install --extra-index-url https://rospypi.github.io/simple rosmaster defusedxml

3つの端末からそれぞれ

  1. まず、rosmasterを起動します。

    . ./venv/bin/activate
    rosmaster --rcore
    
  2. 次に、talkerノードを起動します。

    . ./venv/bin/activate
    export ROS_MASTER_URI=http://localhost:11311
    python talker.py
    
  3. 最後に、listnerノードを起動します。

    . ./venv/bin/activate
    export ROS_MASTER_URI=http://localhost:11311
    python listener.py
    
  4. 最後のlistnerノードで以下の用にSubscirbeしたトピックが表示できたら成功です。

    $ python listener.py
    WARNING: cannot load logging configuration file, logging is disabled
    hello
    hello
    hello
    hello
    hello
    

これでROSをインストールすることなく、Python3のみでROSのノードを書けるようになりました。
MacOSでも同じ事ができることを確認済みです。

中身について

  • PyPIは静的ファイルさえホストできれば作れる(PEP53)
  • tf2_py、PyKDL、cv_bridge等のパッケージははc++のビルドが必要なPythonパッケージだがちょっと頑張ればROSのruntimeに依存せずに実行できる

ような事をしています。

おわりに

今回用意したPyPIは個人で趣味的に作ってみたもので、どこまでサポートできるかわからないですが、ちょっと使って見るには便利だと思うので是非試してみてください。
https://github.com/rospypi/simple

公式でだせるようにしていきたい・・・

Let's enjoy robot programming!