年末なので ROS を調べてちらほらと

ざっと、調べていったことを感想をメモしておきます。

参考文献

読んでいる書籍は以下の通り。

実はチュートリアルも含めて、公式の ros.org にあったりするのですが、書籍/Kindle でブーストしています。邦訳オライリー本は、英語オライリー本が元ネタになるので、実は中身はちょっと古めです。ですが、実はそれで十分だったりします。訳は後述します。

ROS.org | Powering the world’s robots

OpenRTM と ROS

実は、ロボット制御の方法として一方で OpenRTM-aist | The power to connect があります。OpenRTM のほうは国産でなので、日本でロボットをやっていく分には OpenRTM のほうが良いのでは?と思っていた(個人的に)時期もあるのですが、自分はいまのところ ROS な方向で勉強中。そういえば、OpenRTM は Open と名はついているけどオープンではなかったものですが、今ざっとみるとオープンソースな感じになったようです。

Ubuntu と ROS

なんで、ROS は Linux 上で(特に Ubuntu 上で)を想定しいるんだろうか?と思っていたのですが理由がわかりました。

  • ROS の安定パッケージを作りやすくする
  • Ubuntu の LTS (Long Time Support) と時期を合わせている。

2年ほど前 PLAN2 を購入しようと決めたときに、ROS 対応の Intel Edison 版というのがありました。そのときは漠然と ROS + Linux のイメージしかなかったのですが、Edison をつかうことにより ROS パッケージをそのまま使うことができるというメリットがあったのです。実は ROS には Arduino にシリアル接続するパッケージもあるのですが、プログラムの作りやすさ(配布しやすさ?)としては Linux 上のプロセスとして統一したほうが開発効率がよい、というところでしょう。

ただし、現実には Edison 自体がディスコンになってしまったので、PLEN2 + ROS 対応というのはサポート的に難しくなってしまったということろです。

ROS はひとつのロボットを扱う

複数のプロセスが協調動作をする(実際は master がいるのですが)ROS では、ひとつのプロセスがひとつの制御機器を扱う(複数扱えるけど、ひとつに対応させたほうがよさそう)ので、複数のプロセスで「ひとつのロボットを動かす」というのが前提になっています。じゃあ、協調動作するロボット(双腕のロボットとか、複数台が協調するロボットアームとか)はどうするのかというと、まあ、そのまま ROS で作ってもよいし、次のバージョンである ROS2 で作るのがよいというところなんでしょう。ROS2 自体はまで調べていないので言及はしませんが、

  • 組み込み機器に対応している(現状のROSでは、Linux機器に限られる)
  • 各プロセスが直接相互に通信する(現状は master を通している)

というスタイルになるそうです。私としては、まずひとつのロボットを動かせる位に ROS をやってからと思っているので、もうちょっとスタートは前から

ROS Indigo で十分かも

Distributions – ROS Wiki を見ると、ROS は毎年1回定期的にバージョンアップされています。おそらく、Ubuntu のバージョンアップと合わせる形でもあるのでしょうし、ロボットのようなハードウェアを扱う場合、長期的に安定して制御装置が動く必要があるので「あまり頻繁なミドルウェアの更新は望ましくない」としたのでしょう。

そんな中で、現在の最新の ROS は、Lunar というものなのですが、実は 2014年にリリースされた Indigo とサポート期間が同じになっています。

ROS の場合、Ubuntu の apt-get で様々なパッケージを入れることになりますが、それぞれの ROS ライブラリが Linux のライブラリに依存していいます。それらの依存状況によって、毎年の ROS の更新に対して ROS パッケージが更新されていたりされていなかったりするんですよね。このあたりは、Linux の各種ライブラリのバージョンに ROS パッケージ + ROS そのものが依存するという制限のためです。

この理由から、一番 ROS が盛んだった(っぽい)ROS Indigo のパッケージ群 ROS packages が一番充実しています。おそらく、この時期から ROS2 の開発が進みだしたしたので、それ以降のパッケージの更新に手が回っていないのではないか?と想像しています。

最初、最新版がいいだろうと思って ROS Lunar でやろうとしていたのですが、あとで ROS Indigo を入れて試しています。ただし、Indigo を使おうとすると、当時にリリースしていた Ubuntu のバージョンに合わせないと動かないところが多いので、そのあたりは痛し痒し。

ロボットを使わない ROS の動作環境

ロボットや各種センサーを扱うための ROS ですが、ROS 自体は主にプロセス間通信を扱うのでセンサー無しでも利用できます。

なので、ROS を試すだけなれば、

  • VMWare 上に Ubuntu を入れて ROS を導入する
  • Ubuntu on Windows を入れて ROS を導入する
  • ラズパイの Ubuntu を使い ROS を導入する

ということが可能です。これは、Windows 10 の Ubuntu on Windows(WSL/ Windows Subsystem for Linux)で ROS を入れた例ですが、きちんと ROS の roscore/talker/listener のプログラムが動いてます。

image

ROS Lunar のインストール手順は、ひたすら lunar/Installation/Ubuntu – ROS Wiki を追っていくだけです。ペタペタとコピペしていけば、時間はかかかりますが確実に ROS がインストールできます。

超簡単な ROS の仕組み

要は、出版-購読型モデル です。Publish/Subscribe パターンが分かっていれば、ROS の各プロセスの動きに納得がいくし、新しくパッケージを作るのもやりやすいでしょう。

image

要は、プロセス間通信をするときに、Publisher(送り手)とSubscriber(受け手)が直接会話をしません。いったん、トピックという形式にに直して中央の master(ROS では roscore )を通します。これ、いちいち master を通すのが面倒という話もありますが、利点として、

  • publisher は、受け手の生き死に関わらず topic を送れる(master に送るので)
  • subscriber は、送り手の生き死ににかかわらず topic を受け取れる(master がキープしているので)

という利点があります。いわゆる amazon の在庫や流通の倉庫みたいな役割を持たせるのが pub/sub パターンです。これで、何が便利/嬉しいかというと(これ、英語では Are you happy ? … これで良いか?と聞かれるので、Happy = 嬉しい/幸せの直訳ですよ)、

  • 高速なセンサーの類は、ひとまず高速に master にデータをアップロードできる
  • 定期的なデータ抽出は、センサーの状態にかかわらず Subscriber 役の PC などから取り出せる

ということです。いわゆる、クラウドの IoT Hub の仕組みです。というかクラウドの IoT Hub がこれですよね。

そんな訳で、センサーやカメラ機器、場合によっては Android のようなものが Publisher として作ることができます。それを抽出する側の PC だったり Web サーバーだったりスマホだったりするのが Subscriber として作ればよいのです。もちろん、両方の機能を持たせてコンバーターとして働くプロセスを作る事も可能です(実際、そういうパッケージがある)。

データは、Topic で引き渡します。ROS の場合は、あらかじめ msg ファイルを作ることになり、大方のデータ形式は用意されています。ここの Topic で扱う構造体は、オライリーの ROS 本では「標準のものを推奨」していますが、自前で構築する場合は、BLE の GATT よろしくバンバン作ってしまったほうがメッセージのやり取りをするのが便利ではないか、と思っています。まあ、それだと既存の機器につながらなくなるパターンに陥るのですが、要所要所にデータコンバートをする Pub/Sub なプロセスを挟み込めばいいのです(多少、通信効率は落ちるけど)。

 

プログラム言語は Python と C++

ROS の各種サンプルは Python で書かれはいますが、C++ も使えます。というか C++ を使ったほうが便利ですよ、きっとたぶん。

ちょっとした操作ならば Python でもいいんですが、あれこれと各種ライブラリを使ってコンバートしたり既存の科学計算を利用しようとすると、そのままライブラリを組み込める C++ のほうが便利です。とは言いつつ、OpenCV も Python から扱えるし(ROS 自体にも OpenCV を扱うパッケージもあるし)、Python で突き進んでもいいかもしれませんね。

まあ、私の場合、C++ のほうがやりやすいので。

本格的な ROS の Python コードは長かったりするのですが、基本は Pub/Sub パターンで作られた ROS ライブラリを使うことになるので、ひとつのプログラムは 100 行程度で書ける感じです(まだ本格的に作ってはいないので)。たとえば、画像を加工する部分のコードは、ROS であってもなくても関係ないわけで、自前ライブラリとして TDD を使って書いておきます。それを Pub/Sub のパターンに乗せるために、100 行位追加すればよいので、センサーの類を使って通信するプログラムの場合は ROS を使うと開発効率がいいのでは?と思っています。

 

そんな訳で、まだ本格的に ROS を使っている訳ではないのですが、あれこれの情報を見てざっとインストールしたところまでの感想です。どうやら、ラズパイの Ubuntu を入れれば ROS のインストールもさっくりと済むらしいので、

  • Ubuntu on Raspberry Pi
  • タミヤのギアボックス
  • Arduino でモーターと距離センサーの制御
  • USB カメラ から入力して PC で閲覧

までを作ってみようかなと。そうそう、同時にデルタ式の 3D プリンタを組み立ててロボットアームに仕立て上げるのも(1年越しになってるし)。

カテゴリー: ROS パーマリンク