基本編(Turtlebot3の操作とROSの基礎)

この実験はTurtlebot3+OpenManipulator-Xというロボットプラットフォームを用いて、 広くロボットの制御に用いられるROS(Robot Operating System)の分散ノード アーキテクチャを学ぶとともに、シミュレータ(Gazebo)と実機による距離センサや ロボットの内界センサの計測値の取得と可視化の仕方や、それらを応用した環境地図の 生成と誘導(Simultaneous Localization And Mapping)を体験することが目的です。

使用ロボット

実験で用いるロボットはROBOTIS社製のTurtlebot3です。

Turtlebot3+OpenManipulator-X

起動手順

  1. アームがホームポジション( 腕が本体上でたたまれている状態)になっていることを確認する。
  2. バッテリーが接続され、本体前面のスロットに正しく装着されているか確認する。
  3. 本体上面の距離センサに干渉する物がないことを確認する
  4. 平らで開けた場所に置いて、本体前面のスイッチを入れる
  5. アームがホームポジションに移動し、距離センサが回転し始める。

停止手順

  1. 走行している場合は付属リモコンや”teleop” ROSノードからメッセージを送り停止させる。方法がない時は本体を両手でピックアップする(アームを持たないこと)。
  2. 電源が落ちるとアームが脱力するので支えられるように準備する。
  3. 本体前面のスイッチを切る。

バッテリーについて

バッテリーの有効時間は待機状態で90分程度、走行させたりアームを稼働させると 稼働時間が短くなります。長く使わない時はスイッチを切るようにします。

ROSを学ぶ前に〜付属コントローラでTurtlebot3を操作してみよう

RC100Bリモコン

Turtlebot3には1台に1つBluetoothで接続されたリモコンが付属しています。裏蓋を開けて電池を入れ、中央のボタンを長押しすると電源が入って青いLEDが点灯します。 キーを押すと前進後退、左右の旋回をするはずです。確認してみてください。 ただし、ボタンを押している間だけ走るわけではありません。リモコンの右人差し指のボタンを押すと、全ての動きが停止します。まず停止させられるか確認をしてから いろいろ試してみてください。

注意 リモコンの停止ボタンはリモコンから指示した制御信号だけをキャンセルします。後述のROSノード(teleop)やlaunchファイルから指示した制御信号はキャンセルされないので注意してください。

課題1-1

リモコン操作でロボットの動きをよく観察しなさい。リモコンからの入力はどういう信号に変換されて送られていると思うか(位置、速度、加速度など)。各キーにバインドされた制御信号を予想してノートブックに記載しなさい。

ROSの基礎

ROSの構造

ROSの中核部分は、ノードと呼ばれる複数のプログラム(PythonやC++で実装される)が、特定の名前がついたトピックと呼ばれる通信の宛先を介して情報を送受信する仕組みを提供する、通信プラットフォームである。

  • roscore ROS(version1)を使う時には必須のコアシステム。roscoreを共有するノード同士が互いに通信することができ、一群のノードの中でroscoreは1つだけ起動する必要がある。どのroscoreに接続するかは環境変数ROS_MASTER_URIにIPアドレスを含めたURIを記述することで指定することができる。今回の実験ではこのあたりのセットアップはすでに完了してあるので意識しなくてよい。教室には複数のロボットと端末が存在するが、同じネットワークにいてもROS_MASTER_URIが異なるのでそれぞれ別のroscoreを起動できるし、互いに混信せずにすむようになっている。

  • 実機とシミュレータ 今回の実験では各端末上のUbuntu Linuxにロボットのシミュレータ(Gazebo)をインストールしており、最初はシミュレータでロボットの操作の練習をして、うまくいったら実機ロボットに切り替えて同じプログラムを動作させる。この切り替えはlaunchファイルというROSノードの起動スクリプトの中で実行できる(切り替えの仕方については後述する)。

  • メッセージ ROSによるロボットへの指令は全てメッセージと呼ばれるデータをネットワーク通信でノードに送信することで実現される。ROSにおけるメッセージ送受信のアーキテクチャはいくつかあるが、この実験ではPublisher/Subscriberモデルという、一方向通信について学ぶ。このほかにリクエストに対するレスポンスを受け取ることができるクライアント/サービスモデルがある。

ROS Wiki にROSに関するドキュメントが 掲載されている。 その中のノードやトピックに関連するチュートリアルページを以下にまとめる。

ROS Wiki日本語版 ROS Wiki Wayback Machine (日本語版)
ROS チュートリアル URL URL
ROSのノードを理解する URL URL
ROSトピックの理解 URL URL
ROSのサービスとパラメータを理解する URL URL
シンプルな配信者(Publisher)と購読者(Subscriber)を書く(Python) URL URL

ROS Wiki日本語版ROS Wikiはアクセス集中のため、一時的に アクセスできなくなることがある。 その場合は上記の表の Wayback Machine のURLから 参照すればよい。 Wayback MachineInternet Archive による過去ページの キャッシュデータを表示するサービスであり、表示には時間がかかる。

課題1-2

  1. 上の「ROSトピックの理解」(URL on Wayback Machine) を開いて、教員の説明を聞きながら順を追ってROS環境操作の各手順を実行し、内容を理解しなさい。 その後、rostopic pubコマンドを使ってturtlesimのタートルを一定の並進速度・回転速度で動かす命令(ただしチュートリアルサイトの数字とは違う速度の指示値を与えよ)を実行して、そのときのrostopicコマンドの文字列と実行後のタートル表示ウインドウをキャプチャしてレポートファイルに貼りなさい。 画面キャプチャにはgnome-screenshotを使うことができる。
    $ gnome-screenshot --area -f turtle.jpg
    

課題1-3

  1. 上の「シンプルな配信者(Publisher)と購読者(Subscriber)を書く(Python)」(URL on Wayback Machine)のページを開いて、記載されている指示に従いtalker.pyとlistener.pyをダウンロードするか直接ファイルにコピーペーストして保存しなさい。
  2. 保存した2つのプログラムを指示に従って動かして、どういう動作をするか確かめなさい(ターミナルを開いてrosrunコマンドを使う)。
  • rosrun ROSのノードプログラムを起動するためのコマンド。以下の形式で呼び出す。1つ目の引数はパッケージと呼ばれる一塊りのアプリケーション。2つ目の引数はそのパッケージの中で起動すべきノードプログラムの名前である。
    $ rosrun beginner_tutorials listener.py
    
  • roslaunch ROSのノードプログラムをrosrunで個別に起動するとノードがたくさんある時(実際のロボットではノードの数は数十にのぼる)いちいちコマンドを呼び出していられない。これをまとめて実行するためのスクリプトがlaunchファイルであり、launchファイルを起動するためのコマンドがroslaunchである。

主なROS コマンド

ROSコマンドはターミナル(端末)上のシェルからコマンド入力によって操作することが基本です。Gazebo、RVizのようにアプリとしてウィンドウが起動するものもあります。

参考資料 : https://w3.cs.jmu.edu/spragunr/CS354_S19/handouts/ROSCheatsheet.pdf

コマンド 説明
roscore 単一コマンドとして使用され、ROS MasterとROSの実行に必要な各種サーバーを実行します。
rosrun 明示されたnodeを実行します。
roslaunch ファイルに明示された複数のnodeをオプションと共に実行します。
rosclean ROSのlogファイルを確認または削除します。
roscd 明示されたROSパッケージが保存されているディレクトリに移動します。
rostopic ROSのtopic情報を確認します。
rosservice ROSのservice情報を確認します。
rosnode ROSのnode情報を確認します。
rosparam ROSのパラメータ (parameter) 情報を確認します。
rosbag ROS内部のメッセージを記録または再生します。
rosmsg ROSのmessageデータ構造を示します。
rossrv ROSのserviceデータ構造を示します
catkin_create_pkg 自動的にROSパッケージと関連ファイルを生成します。
catkin_make Catkinビルドシステムでパッケージをビルドします。
rospack 明示されたROSパッケージの情報を確認します。

ROSトピックコマンドの詳細

コマンド 説明
rostopic bw トピックで使用されている帯域を表示する
rostopic echo スクリーンにメッセージを出力する
rostopic find メッセージの型からトピックを探す
rostopic hz トピックの配信頻度を表示する
rostopic info アクティブなトピックについての情報を出力する
rostopic list アクティブなトピックをリスト表示する
rostopic pub トピックへデータを配信する
rostopic type トピックの型を出力する

ROSノードをPythonで実装してみる

課題1-4

  1. 授業中の解説を参考に、キーボードで入力したテキスト文字を送受信するROSノードをpython(rospy)を使って実装しなさい。python2ではキーボード入力の取得にraw_input()が使える。
  2. そのコード(サーバ:listener2.pyとクライアント:talker2.py)をレポートファイルに添付しなさい。
  3. テキストの送受信に使用されるトピック名と、送受信メッセージの定義(rosmsgコマンドを使用せよ)をノートブックに添付せよ。
  4. 実行した時の画面表示をキャプチャしてレポートファイルに添付しなさい。
  5. rostopic echoコマンドを実行して、流れているROSメッセージを端末に表示し、それをキャプチャしてレポートファイルに添付しなさい。
  6. rqt_graphコマンドを実行して、ノード・トピックの関係図を表示し、画像としてノートブックに添付しなさい。画面キャプチャにはgnome-screenshotコマンドを使うことができる。
    $ gnome-screenshot --area -f graph.jpg 
    
  7. talker2.pyを複数起動すると、2ノード以上からのテキストをlistener2.pyは表示することができる。実際に試してみて、なぜそれが可能なのか考察しノートブックで説明せよ。

課題1-5

  1. talker2.pyとlistener2.pyのpythonコードを参考に、双方向でテキストを送受信できるように改造した.pyを実装せよ。
  2. 改造したコードをレポートファイルに添付しなさい。
  3. 【発展】実験室のPCやロボットはすべて同じLANに接続しているので,同じroscoreに接続すると別のPCで起動したノードでも相互にトピック通信を行うことができる.課題1-5のtalker/listenerが完成したら,以下の要領で教員のPCで起動しているroscoreに接続し,文字列を送ってみよ.うまくいけば教員のPCにメッセージが表示され,返事がとどくかもしれない.
    • まず,新しいターミナルを開いて,そこで以下のコマンドを入力する.
      $ export ROS_MASTER_URI=http://10.40.41.69:11311
      
    • この状態で同じターミナルで1-5のプログラムノードを起動し,メッセージを打ち込む.
    • うまくいった場合,起動したノードをCtrl-Cで停止したのち,rqt_graphコマンドを実行すると他に繋いでいる人のノードが見えるはずである.確認せよ.
    • このターミナルはそのままだと教員PCにつながったままになるので,タブやウィンドウを閉じるか,以下のコマンドを実行して元に戻す.
      $ source ~/.bashrc
      

課題1-5のヒント: 双方向に送受信できるということは、一つのノードがpublisherの機能とsubscriberの機能の両方を兼ね備える必要がある。 さらに、双方向で送受信できるのだから、talkerとlistenerの区別はもはやないことになる。 つまりpublisherとsubscriberの2つとも一つのノード(python script)に実装すればよい。

ただし、単純にtalker.pyとlistener.pyを合体すればよいというわけではない。 talker.pyは明示的にwhileループが書かれていて一度このループに入るとノードを終了するまで抜け出してこない。 またlistener.pyにはループがないように見えるが、実は”rospy.spin()”の部分が内部でループになっている(この関数の中でcallback関数が呼び出されるのである)。 よってループはどちらか一つにしないといけない。talker.pyの明示的なwhileループを残すほうがわかりやすいだろう。