LoginSignup
35
34

More than 5 years have passed since last update.

ROS TeleopでAndroid-PC間を無線通信してみよう

Posted at

ROS Teleopって?

ROS TeleopはOSRF(Open Source Robotics Foundation)からリリースされているROSで動作するロボットの操作用アプリです。
0.jpg
そもそもROSってなにかって??
ROSというのはRobot Operating Systemの略です。
Robot OSと言ったりもしますがOSではありません。
ロボットのためのソフトウェアを開発するためのビルドツールです。
さらには、ソフトウェアプロセス同士が通信するためのライブラリも用意してくれます。
とにかくOSではありません。ROSに関しては日本語でもWikiがありますので
ここをチェック!!

ROSのいいところ

ROSの一番いいところはプロセスとプロセスの通信を簡単な記述で
自動的に行ってくれるところだと思っています。(あくまで個人的に)
基本的にROSの通信は以下のようなシチュエーションでやることになるかと思います。

  • ひとつのシステムのなかでさまざまな制御プロセスが通信しあう
  • 母艦PC(サーバ)があり、それを介して複数のクライアントが通信しあう

今回は後者のほうに似ています。クライアントであるROS Teleopから入力された
リモコンの命令をPCで受け取るということをします。

ROSの通信スタイル

ROSではPublish/Subscribeメッセージングというものをしています。
image
各要素の役目を簡単に説明すると…

  • Message:ROSで使用するデータの呼び名。中身のデータ構造はROSにあらかじめ用意されているものか独自の定義が可能
  • Topic:メッセージを分類する系統、メッセージの通信経路
  • Publisher:メッセージを特定のトピックへ配信する人
  • Subscriber:特定のトピックを購読対象として登録しメッセージを受信する人

ざっとこんな感じでしょうか。Publisher側は誰がSubscibeしてるだとかは気にすることないし
Subscribe側も登録してあるTopicの中身を読むだけなので互いに疎な関係です。
そのため、各ノード(機能)の追加・変更が用意に行えます。

ROS Teleopを起動してみた。

さて、そろそろ本題に入りましょう。
当初、androidとPCをROSで通信するといってもandroidでROSが
動くかわからないしどうしようとか思っていました。

とりあえずandroidのplaystoreで”ROS"と検索すると
なんと出てくるではありませんかROS Teleopが!!
yaruo_585.png
ということでまずAndoroid側でROS Teleopを起動してみました。
(スクショが手元にないので後で貼ります)

起動すると、roscore(ROSマスターサービスのことroscoreの詳細はここ)の動作しているPCのホストアドレスとポート番号を打てと言われます。
それぞれ打ち込んでconnectを押すとconnected!とかでます。

????
yaruo_10.gif

となりました。つまりROS Teleopが何しているかわからないし、
本当につながっているかどうかも分からなかったわけですね。

ROS Teleopはどこへ何をPublishしている?

ROS Teleopが本当に現在起動中のroscoreに登録されているか知る必要がありました。
そこでROSにはとっても便利なアプリケーションがあるんです。
その名もrosgraph
このアプリケーションは現在起動中のroscoreに登録されてあるPublisher、Subscriberを
GUIで覗くことができる優れものなのです。どんな風に見えるかというとこんな感じです↓
rosgraph.png

注目して欲しいのはandroidという四角。この中ではandroidというパッケージで
2つのノードが登録されていました。

前述した通りPublisherとSubscriberは互いに知り合いである必要はないのですが
Topicメッセージのデータ構造だけはどちらも等しくなければなりません。
つまりAndroidとPC間で通信するためにはROS Teleop(Publisher)が
どこへ(どのTopicへ)何を(どんなデータ構造のメッセージを)Publishしているか
把握する必要がありました。

こいつら調べればなんとかなるのでは!と思ってググってみました。結果

/android/virtual_joystick

  • Publishing
    • Topic: /cmd_vel
    • Type: geometry_msgs/Twist
  • Subscribing
    • Topic: /odom
    • Type: nav_msgs/Odometry

/android/camera_view

  • Publishing
    • None
  • Subscribing
    • Topic: (robot_name)/application/camera/rgb/image_color/compressed_throttle
    • Type: sensor_msgs/CompressedImage

動作しているノードはvirtual_joystickとcamera_viewというノードの2つでした。今回は
PC側へ操作するためのメッセージをPublishしているであろうvirtual_joystickに注目します。

Publishingの項目をみてみると

・ Publishing
 ・ Topic: /cmd_vel
 ・ Type: geometry_msgs/Twist

これはつまり何を意味するかというとcmd_velというトピックにgeometry_msgs::Twistという型のメッセージを送っているということになります。
ということはcmd_velをsubscribeすれば何かわかる!と考えつきました。

geometry_msgs::Twistについて

さて、cmd_velをSubscribeするとはいえこのトピックに配信されるメッセージの
データ構造がわからなければどうしようもありません。ということで調べてみます。
以下のファイルを覗いてみるとこの型の定義やメンバ変数などがわかります。

/opt/ros/hydro/include/geometry_msgs/Twist.h

*ROSメッセージについては以下の記事も書きましたのでご参照ください。
ROSで32bit整数型の配列をメッセージとして使用する
geometry_msgs/Twist.hの中身を調べるとデータ構造はいかに示すようなものでした。
image
vector3クラスのオブジェクトlinearとangularに
それぞれfloat型のメンバ変数がそれぞれx、y、zあるのがわかります。

さぁ通信であります

回りくどいことたくさん説明してきましたが、結局はPCとandroidは接続されていて
データの中身がわからないという状況だったわけです。

ということでcmd_velを購読してgeometry_msgs::Twist型のメッセージを購読してみました!
(ソースコード今は手元にないので後で公開します)
ROS Teleopは以下のようなインターフェイスで操作できます。右にある矢印のついたボタンを
スライドさせてアナログルティックのように方向の操作を行えるようです。
unnamed (1).png
(playstoreから引用。カメラ画像はホスト側からPublishしないと表示されない)

#linearの結果
linear x = 0.668243, y =-0.000000, z = 0.000000
linear x = 0.865166, y =-0.000000, z = 0.000000
linear x = 1.000000, y =-0.000000, z = 0.000000
linear x = 1.000000, y =-0.000000, z = 0.000000
linear x = 0.944478, y =-0.000000, z = 0.000000
linear x = 0.831879, y =-0.000000, z = 0.000000
linear x = 0.731174, y =-0.000000, z = 0.000000
linear x = 0.654750, y =-0.000000, z = 0.000000
#angularの結果
angular x = 0.000000, y =0.000000, z = -0.010223
angular x = 0.000000, y =0.000000, z = -0.000000
angular x = 0.000000, y =0.000000, z = 0.104223
angular x = 0.000000, y =0.000000, z = 0.213782
angular x = 0.000000, y =0.000000, z = 0.246961
angular x = 0.000000, y =0.000000, z = -0.000000
angular x = 0.000000, y =0.000000, z = -0.227378
angular x = 0.000000, y =0.000000, z = -0.327994

写真に示すインターフェイス上で操作をしながらログを取ってみました。
image
スティックを縦に上下するとlinear.xの値が変動し、
スティックを円状に動かすとangular.xの値が変動しました。
他のパラメータに関しては特に変動はみられなかったと思います。

一応これでAndroid-PC間の通信ができて、中身のデータもみれました。

まとめ

  • ROS TeleopはROSのロボット操作用アプリケーション
  • rosgraphは便利
  • PC-android間の通信はroscoreの起動してるホスアドレスとポート番号さえわかれば特別な設定はいらない
  • データの中身をみるためにはメッセージングに使うTopicとメッセージのデータ構造を知る必要がある

おわりに

なんだかタイトルの割には拍子抜けな感じで終わってしまった気がします笑
またわかったことあればちょくちょく記事にしていきたいと思います。

35
34
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
34