GoPiGoのパッケージを見てみる(2)
次はサービスのリストを見てみます。以下のコマンドを実行します。
$ rosservice list
例によって、/rosout系のサービスはroscoreのものです。
/encoder_disable /encoder_enable /led_off_left /led_off_right /led_on_left /led_on_right /ropigo_node/get_loggers /ropigo_node/set_logger_level /rosout/get_loggers /rosout/set_logger_level
サービスは同期型のメッセージングモデルで、1対1でリクエストとレスポンスのやり取りを行うものという説明をしました。実際にメッセージを送ってみます。以下のコマンドを実行します。
$ rosservice call /led_on_left status: 1 $
status: 1がレスポンスとして返ってくるのと合わせて、左側のLEDが点灯するはずです。点灯したままになるので、オフにしておきましょう。
$ rosservice call /led_off_left status: 1 $
このように状態を確実に変更する設定を行うような場合のために、サービスは用意されています。
サービスに関する情報全般は以下のようにコマンドを実行するとで見ることができます。
$ rosservice info /led_on_left
サービスを公開しているノードや呼び出しのためのURI、サービスのメッセージタイプ、引数を見ることができます。
Node: /ropigo_node URI: rosrpc://ubuntu:39896 Type: ropigo/SimpleWrite Args:
それぞれの値については、rosserviceの個別のオプションで参照することも可能です。rosservice -hでオプションを調べることができるので、必要な場合は適宜参考にしてください。
さて、サービスまで大まかに見てきました。次は、実際の開発で使用する場面が多いPub/Subメッセージングを、新しいノードを追加して利用してみます。
新たなノードを追加してみる
ここまではGoPiGoパッケージの中身をのぞいてきましたが、ここからは、GoPiGoパッケージにあらかじめ含まれていないノードを追加してみます。今回はすでに実装済みのノードを追加します。自分でコードを記述してノードを追加する方法については、連載の中で別途説明していきます。
追加するノードはteleop_twist_keyboardというものです。これはキーボード操作によって、ロボットの動きを制御するノードです。
前回、動作確認をした際はrostopicコマンドで/cmd_velトピックに動きのための変数値を設定したメッセージを送信しました。これでは毎回値をセットしてPublishするのでちょっと面倒です。そこでteleop_twist_keyboardを利用します。teleop_twist_keyboardは押したキーによって、/cmd_velトピックに送信するメッセージの変数値を変えて動きを制御できるようにしています。以下を実行してインストールします。
$ sudo apt-get update $ sudo apt-get install ros-indigo-teleop-twist-keyboard
無事インストールできたら、実際に立ち上げて使ってみましょう。roscoreとGoPiGoパッケージを、立ち上げたターミナルとは別の新しいターミナルで以下のように実行します。rosrunは特定のパッケージ内に含まれるノードを指定して実行することができるコマンドです。
$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py
正しく実行されるとキーによる操作方法が表示されます。
Reading from the keyboard and Publishing to Twist! --------------------------- Moving around: u i o j k l m , . For Holonomic mode (strafing), hold down the shift key: --------------------------- U I O J K L M < > t : up (+z) b : down (-z) anything else : stop q/z : increase/decrease max speeds by 10% w/x : increase/decrease only linear speed by 10% e/c : increase/decrease only angular speed by 10% CTRL-C to quit
表示されたキー操作の仕方にしたがってキーを押してみましょう。無事、ロボットが動けばOKです。
teleopの立ち上がっているターミナルで、試しにoを押してみます。その場で右回転するはずです。他のいずれかのボタンを押せば停止します。
キーを押した際、トピックへのメッセージ送信状況を確認してみたい場合は、先ほど/batteryトピックのメッセージを表示してみたときと同様、rostopic echoで/cmd_velを指定することで見ることができます。
最後にteleopのroslaunchファイルを作って、roslaunchで実行してみます。以下のコマンドを実行して、GoPiGoのパッケージのディレクトリに移動し、さらにlaunchディレクトリ下に移動しましょう。
$ roscd ropigo/launch/
roscdコマンドは、ROS配下でパスが通っているパッケージのディレクトリに移動できます。launchディレクトリ下に移動したら、内容を示す分かりやすい名前でファイルを作成します。今回はteleop_key.launchとしました。vimなどで以下の通り記述します。
<launch> <node pkg="teleop_twist_keyboard" type="teleop_twist_keyboard.py" name="teleop" output="screen"/> </launc>
launchファイルはXMLによる記述になっています。nodeタグの属性では、それぞれパッケージ名(pkg)、ノードの実行ファイル(type)、ノード名(name)を指定し、さらに今回は利用キーが出力されるので、標準出力に表示できるようにする指定も行っています(output)。launchファイルのタグ構成など、さらに詳しく知りたい場合は公式ページを参照してください。
作成したファイルをroslaunchコマンドで指定して実行した結果が、rosrunでの実行時と同様になれば、正しくlaunchファイルが作成できています。
既存のropigo.launchに記述を追加することでも実行可能ですし、同時に立ち上げるノードが1つしかない場合、それほど便利になるわけではありません。ただ、今回は練習の意味も兼ねて個別に作成してみました。
さて、前回の内容を引き継ぎながらROSの中身について基本的な部分を見てきました。さらなる詳細については、連載を進める中で必要に応じて解説していきます。次回からはいよいよ「見守り」要素の部分の実装に入っていきます。お楽しみに!