はじめに
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
とするとできます。
以下のサンプルを用意し、
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()
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つの端末からそれぞれ
-
まず、rosmasterを起動します。
. ./venv/bin/activate rosmaster --rcore
-
次に、talkerノードを起動します。
. ./venv/bin/activate export ROS_MASTER_URI=http://localhost:11311 python talker.py
-
最後に、listnerノードを起動します。
. ./venv/bin/activate export ROS_MASTER_URI=http://localhost:11311 python listener.py
-
最後の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!