7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ROSAdvent Calendar 2019

Day 23

Python3のvirtualenvでrospyを使う

Last updated at Posted at 2019-12-22

はじめに

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!

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?