はじめに
ROS Advent Calendar 2017 15日目です。
手持ちのスマホでロボットをちょっと動かしたいという場面はたまにあると思います。ROSで動かせるロボットの場合、Androidだとrosjavaが使えるようですが、そもそもAndroidのビルド環境が必要で「ちょっと」というわけにはいかないようです。またiOSだとROSのオフィシャルなクライアントライブラリもないようで、これも簡単にというわけにはいかないようです。
今回Pythonista上でrospyを動かすことで、スマホの開発環境を構築することなく、iPhoneを使ってロボットを動かすというのが実現できたので紹介したいと思います。
Pythonistaとは
Pythonistaは一言で言うと、iOS上で動かせるPythonの実行環境です。詳細は本家のドキュメントをご参照ください。日本語の紹介記事もあります。簡単に紹介すると以下のような特徴があります。
- コードエディタ、デバッガ、インタプリタ付き
- GUIやグラフィックスもつくれる
- カメラ、写真、クリップボート、バッテリ情報等にアクセスできる
- numpy, matplotlib等便利なライブラリが既に入っている
- Python2.7, Python3.5対応
一方で価格が1,200円もするアプリで、ちょっと遊ぶには高いと思える価格設定です。ただPythonistaを使うことできっと楽しいPython+スマートフォン生活がまっているはず…なので検討してみても損はないかもしれません。
動かし方
事前準備
以下は最新のPythonistaで実行しています。最新のPythonistaはPython3.5がデフォルトになっているので注意してください。
まずは、iPhoneそのままでプログラムを書くのはつらいので、Bluetoothキーボードでつなぐか、ノートPCからプログラムを転送できる環境を作ります。後者は、FileTransfer.py、Dropbox File Picker.py等があります。
インストール
インタプリタで以下を実行します。
import requests as r; exec(r.get('http://bit.ly/1Rq7Zi1').text)
サンプルで通信(Pub/Sub)の確認
サンプルとして、以下のようなプログラムを作成します。
ROS_MASTER_URI
、ROS_IP
は、それぞれ手元のPC及び、Pythonistaを実行している端末のIPを設定します(これを正しく設定しないと通信できません)。
import os
import rospy
import std_msgs.msg
os.environ['ROS_MASTER_URI'] = 'http://192.169.x.x:11311'
os.environ['ROS_IP'] = '192.168.y.y'
os.environ['ROS_PYTHON_LOG_CONFIG_FILE'] = '' # without this, init_node will fail
rospy.init_node('test')
pub = rospy.Publisher('test', std_msgs.msg.Int16, queue_size=1)
rate = rospy.Rate(1)
while not rospy.is_shutdown():
print('publish')
pub.publish(3)
rate.sleep()
手元のPCでroscoreを起動したあと、
$ roscore
... logging to /home/.../.ros/log/03281efc-e0d1-11e7-879e-58946b924f10/roslaunch-...-5345.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.
started roslaunch server http://localhost:36217/
ros_comm version 1.12.7
SUMMARY
========
PARAMETERS
* /rosdistro: kinetic
* /rosversion: 1.12.7
NODES
auto-starting new master
process[master]: started with pid [5356]
ROS_MASTER_URI=http://localhost:11311/
setting /run_id to 03281efc-e0d1-11e7-879e-58946b924f10
process[rosout-1]: started with pid [5369]
started core service [/rosout]
上記のプログラムをPythonistaで実行します。
手元のPCの端末で以下のように入力することでPythonistaから発行されたROSのトピックが、手元のPCで受信できていることが確認できます。
$ rostopic list
/rosout
/rosout_agg
/test
$ rostopic echo /test
data: 3
---
data: 3
---
data: 3
---
data: 3
---
data: 3
---
^C
停止する場合、Pythonistaごと落とす のがいいようです。本当は別のやり方あるような気がしますが、あまり調べていないです。
iPhoneでGazebo内のTurtleBotを動かす
次に、スマホでロボットを動かす例として、iPhoneでGazebo内のTurtleBot3を動かします。
まずは、TurtleBot3のシミュレータを以下のようにして起動します。ROS_IPを.bashrc等で設定している場合は、指定する必要はありません。
$ sudo apt-get install ros-kinetic-turtlebot3-gazebo
$ ROS_IP=*PCのIP* TURTLEBOT3_MODEL=burger roslaunch turtlebot3_gazebo turtlebot3_world.launch
次に、Pythonistaにプログラムをインストールします。インタプリタで、下記を実行しturtlebot.py
をダウンロードします。
import request as r; exec(r.get('http://bit.ly/2CofYwv').text)
turtlebot.py
をPythonistaで実行すると、下記のような画面になるので、Robot IPにシミュレータが動作しているPCのIPを設定して、CONNECTボタンをおします。
無事接続されると、スライダでTurtleBot3の速度が変えられるようになります。
アンインストール
site-packages以下にrospy等がインストールされているので不要になったら削除してください。
中身について
PythonでROSを動かすには、(1)rospy本体とその依存モジュール、(2)メッセージ(std_msgs, sensor_msgs等)のシリアライゼーション用モジュールが必要です。ROSは基本的に、debianパッケージで配ることを想定されているため、pip等ではインストールできません。
そのため(1)については、GitHubからzipファイルでソースコードを取得することで、(2)ついては、GitHubからメッセージファイル(*.msg)を取得し、Pythonista上でgenpyを実行しダウンロード時に生成することでインストールを実現しています。
https://github.com/otamachan/get-rospy
https://github.com/otamachan/pythonista-turtlebot-controller
終わりに
Pythonistaを使うことでスマホアプリの開発環境を用意することなく、ROSでロボットが動かせるようになりました。
ちょっとしたデモ等でスマホでロボットが動かせるといろいろ便利かと思います。
Enjoy happy ROS hacking!