動かして学ぶ簡単ROS入門⑤ ROSを使用した走行ロボットの操作

動かして学ぶ簡単ROS入門

これまではROSの基本的な概念理解やWebカメラ、深度カメラからのセンサデータをROS経由で取得するということを行ってきました。5回目となる本記事では「Plus」という移動走行ロボットをROSによって操作するということをやっていきます。まずは基礎的なところでロボット単体での操作を行っていきますが、これができれば、これまで扱ってきたカメラやセンサと組み合わせて自立移動型の走行ロボットを作ることも可能になります。

1.移動走行ロボット「Plus」について

Plusは株式会社Life Tech Roboticsが製造している移動走行ロボットです。プログラムによるロボットの操作を前提に作られており、M5Stackと呼ばれるWifiやディスプレイを備えた小型のマイコンモジュールで制御されています。

こちらのページからロボットの詳細や購入に関する情報をご覧頂けます。Plusの特徴として、Wifi経由で制御可能な自立走行ロボットの開発を簡単に始められるようになっており、ロボットアームなどと組み合わせることで様々な用途に応用ができるようになっています。

今回、走行ロボットを動かすためのシステムは以下のような構成となります。Plusに搭載されたM5StackのWifiでPCとやり取りを行い、ユーザがPC上で指示した動作がROSのプログラムによって処理され、Wifiを通じてPlusのM5Stackに送信されロボットが動きます。

2.Plusのセットアップ

Plusそのものの電源投入までのセットアップはPlusを購入頂いた際のマニュアルに沿って行って頂くとして、Plusに搭載されたM5Stackの無線まわりの設定からここでは説明していきます。

PlusをPCと同じ無線親機に接続させるために、スマートフォンにEsptouchというアプリをインストールします。このEsptouchというアプリがスマートフォン経由でM5stackの無線設定を行います。

Android: https://play.google.com/store/apps/details?id=com.dparts.esptouch&hl=ja&gl=US&pli=1

iPhone: https://apps.apple.com/jp/app/espressif-esptouch/id1071176700

Plusの電源をONにすると、Plusに搭載されたM5Stackが立ち上がり、以下のように表示されます。

ここでAボタンを押下し、Wifi設定待ちの状態にします。

次にスマートフォンをPCと同じ無線親機に接続し、Esptouchを立ち上げます。立ち上げるとEsptouchとEsptouch V2を選択する画面が出てくるので、V2ではない普通のEsptouchのほうを選択します。

次の画面でWifiのパスワードを入力し、「Comfirm」ボタンをクリックします。

上手くM5StackのWifiの接続ができると以下のようにM5Stackに割り当てられたIPが表示されるので、このIPをメモっておきます。

以上でPlus側の設定は終了です。

3.PCのセットアップ

次にPC側のセットアップを行っていきます。今回使用するROSパッケージはPlusのROS用のドライバパッケージになります。

このパッケージは、これまで使用してきたパッケージツールであるaptでは取得できないものになるため、ソースコードをダウンロードして、PC上でビルドし、パッケージを作成するということを行います。

まず、GithubというWeb上でソースコードを共有できるサイトからソースコードを取得します。

このとき、ホームディレクトリから見て以下のようなフォルダ構成となるようにパッケージのソースを配置します。

ros
└── src
	└── <rosのパッケージのソース>

今回取得するパッケージの名前は「plus_ros1_driver」という名前になります。

以下のコマンドでソースコードを取得します。

$ sudo apt install git
$ cd  # ホームディレクトリへ移動
$ mkdir -p ros/src
$ cd ros/src
$ git clone https://github.com/nanoxeed/plus_ros1_driver.git

ソースコードを取得できたので、次にビルドを行っていきます。ビルドとはソースコードから実際にPC上で動かせるアプリケーションを作成するプロセスのことを言います。

ROSのビルドを行うために必要なcatkinというプログラムをインストールします。

$ sudo apt install python3-catkin-tools

このcatkinというツールを用いて、ビルドを行います。

$ cd ros
$ catkin build

以下のように何もエラーなく終了すればビルド完了です。

ビルドが完了すると、rosディレクトリの下にsrc以外にbuildとdevelとlogsディレクトリが作成されているのが分かります。これらがビルドによって作成され、この中のdevelというディレクトリに最終的なパッケージが作成されます。
これでPC側の設定も完了しました。

4.コントローラの接続とROSノードの立ち上げ

roslaunchを使用して、使用するノードを複数立ち上げます。今回はソースから作成したパッケージを使用するため、そのプログラムの場所を設定するコマンドを予め実行して、roslaunchを実行します。roslaunch実行時に引数でEsptouchで取得したM5StackのIPを入力します。

$ source ros/devel/setup.bash
$ roslaunch plus_ros1_driver ui_control.launch ip:=<Esptouchで取得したIP>

プログラムが立ち上がると、以下のようなGUIが表示されます。

このGUIのUpボタンを押すとロボットが前進し、Downボタンを押すとロボットが後退します。LeftおよびRightボタンはそれぞれ左旋回、右旋回になっています。ロボットを止めたいときはStopボタンを押して下さい。

ここまでで、ユーザの指示でGUIを経由して走行ロボットを動かすことができました。次に簡易的な自立移動ロボットのプログラムの作成を行っていきます。

先ほどのGUIを用いたプログラムではcontrol_uiというノードとplus_m5baseというノードが実行されています(前回のrosnodeの使い方を思い出して確認してみてください)。control_uiがユーザのボタンクリックからjoyというトピックに対し、メッセージをplus_m5baseに送信することでPlus本体にデータが送信されるようになっています。

つまり、joyトピックを上手く調整することでロボットが一定の軌道を動くようなプログラムを作ることができます。

joy_test.pyというファイルを作成し、以下のコードを記述してください。

import rospy
from sensor_msgs.msg import Joy
import time


rospy.init_node("joy_test", anonymous=True)
pub = rospy.Publisher("joy", Joy, queue_size=10)
value = 0.2
time.sleep(1)

# Forward
msg = Joy()
msg.axes = [0, value, 0, 0, 0, value]
pub.publish(msg)
time.sleep(2)

# Left
msg = Joy()
msg.axes = [0, -value, 0, 0, 0, value]
pub.publish(msg)
time.sleep(3.5)

# Forward
msg = Joy()
msg.axes = [0, value, 0, 0, 0, value]
pub.publish(msg)
time.sleep(2)

# Stop
msg = Joy()
msg.axes = [0, 0, 0, 0, 0, 0]
pub.publish(msg)
time.sleep(1)

このプログラムをroslaunchを実行した状態で、別のターミナルを開き、実行します。

$ python3 joy_test.py

実行すると、ロボットが2秒間前進し、その後90度くらいまで左旋回し、また2秒間前進するという動作で動いたと思います。
joy_test.pyのコードを見ると、動作の調整を行っているのはjoyトピックpublish後のsleepのところで、このsleepに与える時間(秒数)を調整することで、移動量の調整を行っています。このスクリプトを編集して、joyトピックの送信を追加したり、sleepの時間を調整することで、決まった軌道上を動くロボットを作ることができます。
今回の自立移動プログラムは簡易的なものであり、路面の状況やロボットの個体の微妙な違いで軌道がずれて、思ったとおりの軌道で動かないことが起こります。応用的な内容になりますが、ロボットにカメラなどのセンサを設置して状況のフィードバックを行う機能を追加することで、より安定して同じ軌道を動くロボットを作ることができます。

5.まとめ

Plusという走行用ロボットをROSを用いて操作することができました。Joyメッセージにコマンドを送ることで、ロボットを自在に操作できるということが分かったと思います。今回行った自立走行はかなり簡易的なものであり、毎回同じ経路を通ったり、障害物を避けたりということができません。これを行うには、ロボットの位置を計測したり、障害物を検知するセンサを設置する必要があります。このような位置計測や障害物検知は前回、前々回で扱ったカメラや深度カメラを用いて行うことができます。より高度な機能を持つロボットを作るために、ROSで新たにパッケージを作成したり、組み合わせたりして独自のロボットを作ってみて下さい。

関連記事

特集記事

コメント

この記事へのコメントはありません。

TOP