最近、ROSっていう、ロボット開発のオープンソフトウェアを勉強させてもらっております!
せっかくなので、「ROS(Robot Operating System)」ってなんだ、、、みたいなのをゆるっと紹介してみようかと思います(/・ω・)/
ROS2…ってやつもあるらしいんですが、
もともと、
・単体ロボットを使う
・とりあえずロボットを制御したい(研究用)
・動かせればいいので、リアルタイム性とか小型化はいったん保留…
っていうような背景で作られたのがROS
動くようになってきたし、商用版にしたり、小型化したり、複数ロボットを連携させたいなぁ…
っていうようなニーズに対応したのがROS2
……なんだけど、
ROS2の開発中にROSに影響を与えたくないなぁー、とか
ROSのユーザーも多い中、あまり大きな変更をしたくないなぁとか
そういう背景から、別物として作られたもの…らしいです
わかりやすいサイトがあったので、気になる方は… → コチラ
それでは本題
ROSってなんだ、っていうことで
特徴をあげておきます。
- 色々な言語で書ける。(C++, Python, Java, octave, Lisp ※メインはC++, Python)
- node、message(topic)っていう仕組み
- 色々なパッケージが公開されている
ひとつづつ見ていこうと思います
1.色々な言語で書ける。(C++, Python, Java, octave, Lisp ※メインはC++, Python)
特徴でよくあげられるところです。
個人的には、あまり触ったことのない言語が多く、
拡張子を見て、あなたは誰ですか!?(Lisp)……っていうこともあったのですが
オープンソフトウェアであることを考えるといいところなのではないでしょうか。
知らない言語でも、読む分には
このコードは何を受け取って、どんな情報を何を出してるのかな…程度であれば、
型とかから何とか判断できるので、まぁ困らないなという印象です…
2.node、message(topic)っていう仕組み
ROSには、プログラムの最小単位として、単純な処理を行うROSNode…というものがあり、
ロボットはROSNodeの通信で制御される…という仕組みです
例えば、
- ロボットに乗っているセンサーが得た情報を、「sensor_publisher」というNodeが受信する「sensor_subscriber」は、得られた情報をsensor_msgs/LaserScan型の「scan」というtopicを乗せて、messageを発信する
- 「scan」というトピックを受信する、と定義された、「log_subscriber」というNodeが「scan」を受け取り、ログを出力する
- 「scan」というトピックを受信する、と定義された「map_publisher」というNodeが「scan」を受け取り、これを解析してマップデータ()を作成し、「map」を送信する
このメッセージをどのNodeに送る、という命令文がなくても、
- この名前のtopicを送る
- この名前のtopicを受信する
という仕組みで動いているから使いやすい!……という感じです(/・ω・)/
人の書いたコードを読むにあたっても、
途中処理の計算式がわからなくても、
最悪、このNodeは何を受信していて、何を発信しているから、
中でしている処理はこんな内容かな??……という判断が割とつきやすくなっています!
Nodeの種類としては、紹介だけですけど、
- Publisher と Subscriber
- ServiceServer と ServiceClient
- ActionServer と ActionClient
- BroadCaster と Listener
……などなど、基本はNodeとtopicのやり取りですが、
一回だけ通信する、複数回通信する、、、などの目的ごとに使い分けるそうです!
難点としては、Nodeはプロセスなので、通信が多くなると、小型機は重たくなって動かなくなる…なんてことがあるところらしいです。
対策として、「NodeLet」っていうパッケージ(Nodeとか、処理に必要なファイルとかをひとまとめにしたもの)があり、そこに、NodeLet型のNodeみたいな処理をするものをロードして、通信を減らす…なんて手法もあるそうです。
難解。
3.色々なパッケージが公開されている
これです!!
オープンソフトウェア、ROSには、世界中から公開された、たくさんのパッケージがあります
「加速度センサー ROS」でGoogle検索してヒットしたパッケージ ↓
http://wiki.ros.org/ja/rt_usb_9axisimu_driver
https://github.com/tork-a/adi_driver
(商品名とか入れたらもっと出るのかもしれないですね……)
Lidarという、センサーを使い、マップを生成するパッケージでは、まとめページなんかも作られています…
上で紹介した、Node、Topic…というシステムのおかげで、
このNodeは何を発信して、何を受信する、というものだけ適合すれば、
処理を連携させることができるので、とても簡単にいろいろな処理を乗せられる仕組みになっているように思います!
勉強するにあたっては「TurtleBot3 Burger」……というロボットをお借りしていたのですが、
書いてある通りに組立てて
公式からパッケージを入れて
3つぐらい、Gitで公開されているパッケージを入れただけで
- キーボード操作
- マップ生成
- 自走
…ができて驚きました……
しかも、PC上でシミュレーションもできる……
↑ TurtleBot3の公式サイトで紹介されている動画
TurtleBot3はROSを勉強するためのツール、なので
実際にロボットをうごかすとなると、
使うセンサーに対応したパッケージがない、
こういうログを残したい、
ここで連携が必要
などなど、あると思うんですけど、
センサーデータを取得して、成形すれば、
パッケージを選んでインストールすれば地図生成、姿勢制御はある程度公開されているパッケージで補える…
って考えると、本当にすごいシステムだなぁと思いました
(まぁ、まだ、C++、Pythonも触ったことがほとんどないので、読むしかできないんですけど…)