GoPiGoのパッケージを見てみる(1)
ここからは、第1回で設定したGoPiGo用のROSパッケージを見てみることにします。使われているトピックやサービスについて、前回実行した内容を含めて説明します。今回は内容のボリュームと、一度に詰め込むと消化不良になってしまう可能性を考慮して、代表的な部分の説明にとどめておきます。今回説明しないものに関しては今後の連載で説明する予定です。また、もう少し詳しく知りたいという方は、連載の内容を元に公式サイトなどを参考にしてください。
準備
まずはGoPiGoのROSパッケージで使われているトピックの一覧を見てみましょう。トピックのリストを表示するため、前回同様にroscoreとGoPiGo用のパッケージ一式を立ち上げます。GoPiGoにアダプタを接続するか、電池による稼動が可能であることを確認してスイッチを入れ、sshで接続後に適宜tmuxなどを利用し、複数ターミナルを用意します。
1つ目のターミナルでroscoreを実行します。
ubuntu@ubuntu:~$ roscore
2つめのターミナルでGoPiGo用パッケージ一式を立ち上げますが、その前に少し作業をします。前回の記事では、i2c用の/dev/i2c-1デバイスファイルにアクセス権限をつけていましたが、それでは毎回この作業が必要になってしまいます。そこで、i2c-toolsを導入し、i2cグループにユーザーubuntuを追加することで、毎回作業をせずに済むようにします。
$ sudo apt-get update $ sudo apt-get install i2c-tools $ sudo groups ubuntu ubuntu : ubuntu adm dialout cdrom floppy sudo audio video plugdev users netdev $ sudo usermod -aG i2c ubuntu $ sudo groups ubuntu ubuntu : ubuntu adm dialout cdrom floppy sudo audio video plugdev users netdev i2c
i2c-toolsをインストール後、usermodコマンドでユーザーubuntuをi2cグループに追加しました。groupsコマンドを実行し、i2cが追加されていればOKです。usermodコマンド実行時には-aオプションをつけるのを忘れないようにしましょう。そうしないと、追加ではなく上書きになってしまうため、他の所属グループの設定が消えてしまいます。グループ追加後は一度ログインしなおしてください。
上記を実行後、GoPiGoパッケージを立ち上げます。エラーなく立ち上がるかを確認してください。
$ roslaunch ropigo ropigo.launch
さて、前回と同様のところまで準備は整いました。ここで、これまで説明せずに使っていたものを簡単に解説します。
まずはroscoreです。このプロセスは全てのノードのマスターとして、各ノード間の通信が成立するように名前解決などの役割を担っています。Pub/Subのブローカーとしての役割もroscoreが行っています。roscoreが立ち上がっていない状態ではノード間の通信が成立しないため、何もできません。
次にroslaunchというコマンドについてです。これは複数のノードをまとめて立ち上げるためのツールです。通常、ロボットを動かす場合はいくつものノードを連携させて動かすことになるので、それらを1つ1つ起動していくのは手間です。そのため、launchファイルという設定ファイルに必要なノードを記述しておくことで、それらをまとめて立ち上げられるようにしています。launchファイルについては本連載で出てくる予定です。その際は中身も確認してみてください。
- roscore:全てのノードのマスターとして振る舞い、名前解決などノード間通信の中心的プロセス
- roslaunch:複数のノードをまとめて起動できるようにするためのツール
GoPiGoで利用されているNode、Topicリストを見てみる
では、実際にどんなノードやトピックがあるのか見ていきましょう。
まずはノードリストです。以下のコマンドを実行します。
$ rosnode list
/ropigo_node /rosout
/ropigo_nodeと/rosoutの2つのノードがあることが分かります。/rosoutは先ほど起動した、マスターにあたるroscoreを立ち上げた際に含まれるノードで、/ropigo_nodeがGoPiGoのパッケージのノードになります。
次に、ROSのトピックリストを表示してみましょう。以下のコマンドを実行します。
$ rostopic list
実行結果は以下の通りです。
/battery /cmd_vel /lwheel /rosout /rosout_agg /rwheel
全部で6つのトピックが表示されましたが、このうちrosoutとrosout_aggはrosoutノードのトピックで、それぞれ標準出力的な役割と標準出力へのsubscribeのログ表示を担っているものです。この2つを除いた残りがGoPiGoのパッケージに含まれるノードが利用しているトピックとなります。
トピックのリストについては、rosnodeのinfoオプションでも見ることができます。例えばropigo_nodeノードについて実行したもの見ると以下のようになっています。
$ rosnode info /ropigo_node ----------------------------------------------- --------------------------------- Node [/ropigo_node] Publications: * /lwheel [std_msgs/Int16] * /battery [sensor_msgs/BatteryState] * /rwheel [std_msgs/Int16] * /rosout [rosgraph_msgs/Log] Subscriptions: * /cmd_vel [unknown type] Services: * /encoder_enable * /led_on_left * /led_off_left * /led_on_right * /led_off_right * /ropigo_node/set_logger_level * /ropigo_node/get_loggers * /encoder_disable contacting node http://ubuntu:57442/ ... Pid: 1706 Connections: * topic: /rosout * to: /rosout * direction: outbound * transport: TCPROS
rosnode infoで確認した場合は、さらに詳細が表示されます。この後に説明するメッセージについてや、サービスのリストもまとめて見ることができます。
では、前回動作確認時に使ってみたものとして、/cmd_velをとって、もう少し中身を見てみましょう。以下のコマンドを実行してみます。
$ rostopic type /cmd_vel
結果として、geometry_msgs/Twistが返ってきました。
geometry_msgs/Twist
これはこのトピックで実際にやり取りされるメッセージの型を示しています。前回、GoPiGoを試しに動かしてみた際に実行した内容を少し思い出してみてください。
$ rostopic pub /cmd_vel geometry_msgs/Twist "linear: x: 0.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.2"
上記のように実行しました。これは/cmd_velトピックにgeometry_msgs/Twist型のメッセージを送っている事を意味しています。さらにその後ろには、メッセージに含める実際の値が指定されています。こちらもどのようなものだったのか、もう少し調べてみましょう。以下のコマンドを実行します。
$ rosmsg show geometry_msgs/Twist
実行結果は以下の通りです。
geometry_msgs/Vector3 linear float64 x float64 y float64 z geometry_msgs/Vector3 angular float64 x float64 y float64 z
前進・後退の値を指定するlinearと、回転の値を指定するangularという2つの変数があり、それぞれfloat64の値を3つもつベクトル型であることが分かります。前回の実行はこの変数の値を指定していたことになります。/cmd_velのトピックと、そこで使われるgeometry_msgs/Twistのメッセージ型はROSであらかじめ定義されているものですが、オリジナルのものを定義することも可能です。ここでは深く扱いませんが、今後連載の中で必要に応じて説明を加えていきます。
もう1つ、トピックについて調べてみましょう。今度は実際にPublishされている内容をみてみます。以下のコマンドを実行します。
$ rostopic echo /battery
内容としては以下の通り表示されるはずです。
header: seq: 17374 stamp: secs: 0 nsecs: 0 frame_id: '' voltage: 4.3701171875 current: 0.0 charge: 0.0 capacity: 0.0 design_capacity: 0.0 percentage: 0.0 power_supply_status: 0 power_supply_health: 0 power_supply_technology: 0 present: False cell_voltage: [] location: '' serial_number: ''
rostopicにechoオプションをつけると、実際のPublishの様子を見ることができます。
割り込みをかけて止めるまで、ずっと上記のような電源周りの状態が流れてくるはずです。これらメッセージの変数に納められPublishされている値を、Subscribeしているノードが取り出して処理に利用することになります。
ざっと2つのトピックを取り上げて見てみましたが、その他についてもコマンドを使い、どのようなものか適宜調べてみてください。