本当は先日購入したNVIDIA Jetson TX2でディープラーニングのROS対応を色々と進めていきたかったのですが、とある遠い国から

LEGO Mindstorms EV3をROSで動かして卒業論文を書きたくて、情報を探るとあなたのSpeakerDeckにたどり着きました。 とても助かっているけれど、でも英語じゃないから完全には理解できません。英語の情報はありますか?

といった内容(実際には英文)で嬉しい連絡をいただきました。 なので、まずはEV3のROS対応を改善することを先に進めないといけません。 数週間は時間をもらっているので、今日からはEV3のROS対応の復活とドキュメンテーションを頑張ります。

途中までは以下のブログで進めていましたが、ROS2対応させるため、FreeRTPSをセットアップするところで頓挫して諦めかけていました。

とりあえずFreeRTPSの話は中断し、ROS1対応を急ぐことにします。 これからやることを時系列順にリストアップします。

  1. まず2年前のプログラムを復活させる。
  2. EV3とリモートPCとの間の通信プロトコルを改善する。
  3. 日英のドキュメンテーションを整える。
  4. バイナリパッケージ化する。

2に関してですが、2年前のプログラムではRPyCというPythonモジュールを使っていました。

リモートPCからEV3のPythonモジュールをPythonスクリプトそのままの形で呼び出せるRPCを実現しており、非常に便利なモジュールです。 このおかげでROS対応は1日でできました。 ただし、計算量も通信量もEV3にとっては重たいモジュールだったので、通信環境が悪い場所では動かすことがほとんどできませんでした。

今回はせっかく再度挑戦するのですから、ここの部分にメスを入れましょう。 これまではFreeRTPSで置き換えるつもりでしたが、それは当面うまくいきそうにありませんので、違う通信プロトコルを考えないといけません。 しかもev3devにすでに対応済みであることが条件です。

この条件で、一番良さそうな通信プロトコルはMQTTでしょうか。 ありがたいことに、PythonモジュールもEV3で動作しているようです。

また、今回はEV3対応のみを考え、LEGO Mindstorms NXTは対象としません。 というかNXTはもう誰も使っていないでしょう笑

python3-ev3dev

2年前のプログラムを書いた時には、ev3dev公式のPythonドライバがなかったのですが、今はあります。 それがpython3-ev3devです。

https://github.com/rhempel/ev3dev-lang-python

import ev3dev.ev3 as ev3
ts = ev3.TouchSensor()
while True:
  ev3.Leds.set_color(ev3.Leds.LEFT, (ev3.Leds.GREEN, ev3.Leds.RED)[ts.value()])
m = ev3.LargeMotor('outA')
m.run_timed(time_sp=3000, speed_sp=500)
ev3.Sound.speak('Welcome to the E V 3 dev project!').wait()

以前使っていたのはpython-ev3というPythonモジュールでした。 使い方はほとんど同じようですので、安心しました。

次回はMQTTを学びます。