SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ROSとRaspberryPiで遠隔みまもりロボットを作ろう(「Tech-Sketch」出張所/番外編)

ラズパイで動くロボット「GoPiGo」をつかって遠隔見守りロボットを作ろう(2)ROS基礎編

ROSとRaspberryPiで遠隔みまもりロボットを作ろう 第2回(「Tech-Sketch」出張所/番外編)

  • X ポスト
  • このエントリーをはてなブックマークに追加

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つのトピックを取り上げて見てみましたが、その他についてもコマンドを使い、どのようなものか適宜調べてみてください。

次のページ
GoPiGoのパッケージを見てみる(2)

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
ROSとRaspberryPiで遠隔みまもりロボットを作ろう(「Tech-Sketch」出張所/番外編)連載記事一覧

もっと読む

この記事の著者

佐伯 純(TIS株式会社)(サエキ ジュン)

TIS株式会社 AIサービス事業部AIサービス企画開発部所属入社後、アジャイルで商品先物取引のシステム開発という当時としてはかなり尖ったチームに放り込まれ、以来SIerとは思えない辺境を歩き続けている。現在の部門に異動してからはRubyOnRailsを利用した社内向けサービスの開発に参加後、Andr...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/9965 2017/02/20 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング