あなたに次の選択肢を用意するサイト
Thoth Coworker
~ プログラミングの次++ ~
For
新社会人 / 新学生 / 新院生 / 新研究者
カテゴリ
ROS全体を知る
Facebookシェア Twitterツイート LINEで送る
P
ポイント
ROS全体を知る
ROSV1の全体について簡単に知りたい人が学ぶための記事
  • Point 1
    分散したノードで起動
    一つのプログラムで致命的なエラーが起きた時に全てのシステムが落ちることがないよう、ROSでは機能をプログラム(ノード)ごとに起動し、やりとりをネットワークで通信するよう分散になるようにしています.
  • Point 2
    roscoreが全てを把握
    roscoreはどのノードがどういった情報を出しているかを把握しています.お互いのノードが通信を始めるために必ずroscoreと連絡を取ります
  • Point 3
    ノード同士で通信
    各ノードは自分がネットワークに提供できる情報と取得したい情報を周りに伝えておくことで、他のノードが画像や角度や位置やその他情報を求めたり提供したときに対応できるようになっています.Pub-Sub型の通信になっており、多対多のやりとりが可能です.
P
ステップ概要
ROS全体を知る
ROSとはそもそもどういうソフトウェアなのかについて解説します
ROSがあったらどのようにシステムが動くのかを紹介します
ROSが与えてくれるものは何かについてより詳細を解説します
ROSv2の普及状況などについて共有します
Step
1
ROSとは
ROSは、RobotOperatingSystemと呼ばれるロボットのミドルウェアとされています.実際はミドルウェアというよりはライブラリ群のイメージで良いかとおもいます.ROSを組み込むことのメリットを初めに見てみます.
ポイント : ROSを使うメリット
  • 多くの共通コードを活用/自分で全部の開発や修正が不要
  • プログラム同士の連携が簡単
  • 多くのプログラミング言語で扱うことができる
  • オープンソースで開発
  • ロボットのコミュニティとして規模が大きい
などが挙げられます.
多くの資産を活用できるというのは明らかなメリットです.例えば今自分はロボットの動作の研究をしたいのに、モーター制御や認識、センサやカメラの不具合を直したり、ログ取得のプログラムを改善したりしている時間は非常に損失です.しかしROSを使用しているパッケージを使用すれば、それらは世界中の開発者/研究者によって日夜改善され、自分で実装するより不具合も少なく自身の本当に研究/開発したいところに打ち込むことが可能です.

プログラム同士の連携は非常に簡単で、他の人が書いたプログラムは簡単にすぐ立ち上げることができ、またそれらの調整や通信もROSであっという間に行うことができます.ROSのちょっとしたルールにプログラムが従っていれば簡単にそのROSで構成されたシステムに組み込むことができます.全てのプログラムがモジュール化しているため、一部を差し替え新しいプログラムを試すのも非常に手間なくできます.

プログラミング言語はPyhton, C++, C, JavaScript, LISP, Java ...と幅広いです.ROSからROS用のプログラムに改変するAPIは提供されるため、それを取り込むだけで他に意識しなくてはならないことはありません.Webやマイコン、スマホあらゆるプラットフォームで対応できます.

オープンソースで開発されているため、自身でコミュニティに貢献することも、自分のところでコードを改善/変更することも容易です.さきほど書いたように日々多くの人が使っているため不具合も洗い出され、メジャーなパッケージの品質は高い状態です.

また、ROSのコミュニティは非常に大きく、海外含め多くの研究者/開発者が使用しています.QAサイトやWikiなども充実しており,多くの人が関わっているため, 提供されるパッケージは多岐にわたり品質も高いです.

Step
2
ROSで動くシステムの構成
それでは実際にROS(v1)を導入したロボットの環境がどうなっているかを見てみます

こんなロボットを作りたいとしたらどのようにプログラムを準備しなくてはならないでしょうか?
ポイント : 例 : カメラの画像で腕を動かすシステム
  • センサはカラーカメラと3Dデプスカメラ
  • ロボットには腕がある
  • 障害物回避してぶつからないように物体を掴みたい
  • 後で確認できるようにデータを取りたい
  • 状態を常に可視化したい


片腕のロボットだったとしても、実際これを作るだけでもかなりのプログラムを準備しないといけなくなります.ざっと必要な機能を挙げると

  • ロボットモデルを作成
  • ロボットのキャリブレーション
  • カメラのキャリブレーション
  • カメラとロボットの手先の位置関係を計算
  • カメラからのデータを取得
  • 3Dセンサからのデータを取得
  • 3Dセンサで得たデータから自身の腕分を除去
  • カメラからの画像で物体の位置を認識
  • 3Dセンサのデータからその物体の3次元位置を取得
  • センサデータを元にアームのパスプランニング
  • アームの座標関係を計算
  • 物体の把持方法を算出/決定
  • 指定された角度列に沿うように関節角度角を目標にアームを作動
  • インピーダンス制御によって安全な動作
  • 力センサや触覚センサで把持したことを検知
  • モータに異常,ロボットに異常があれば通知
  • センサデータのログを集積
  • 関節角度データのログを集積
  • ロボット動作/認識の可視化
  • ロボットの緊急停止モード

などがあり、非常に準備が大変です.またこれらを一つのプロセスで動くように実装したとして不具合がどこかの機能に一つあるだけで全てのシステムが停止してしまいかねません.問題があっても修正するのは自分だけになってしまい、非常に時間を要します.
そこでROSを導入した場合に自分で用意する必要のある機能/作業を見てみましょう.

  • ロボットモデルを作成
  • ロボットのキャリブレーション
  • カメラからの画像で物体の位置を認識
  • 物体の把持方法を算出/決定

恐らく、必要な機能が提供されていない機能又はどうしても必要な作業は上記の機能くらいです.これ以外のプログラムはROSで提供されているので積極的に活用しましょう.副次的に嬉しいことですが、ROSを導入することになるため、認識などは他の人が提供しているプログラムも簡単に試すことができます.

ROSで組んだ場合の簡易的なシステムの構成は以下のようになります.
画像 : 画像処理例 : ROSを使ったシステムの構成例

難しく見えるかもしれませんが、流れは非常にシンプルです.

まず各四角はプログラムとなっており、それぞれが分散して動いています.そのプログラム間でメッセージ(楕円)を受け渡しあって連携して動作します.
Cameraや3Dセンサから入ってきた入力を処理して自分で作った認識プログラム、把持位置決定プログラムで計算を行います.その結果に基づいてROSの動作計画を行うMoveItを使用して腕の動きを決めます.その腕の動きをアームをコントロールするJoint Trajectory Controllerに送り、腕を動かしてもらいます.

また他にいろいろなデータを効率よく蓄積してくれるrosbagや受け取ったデータを可視化できるrvizといった機能もついてきます.

これら全体の管理をしているのがroscoreになります.
Step
3
ROSが提供する環境
それではROSは何を提供してくれるのでしょうか?
ここでは、主要な機能に絞り簡単にまとめてみます.
画像 : ROSが提供する機能

ROSは環境が充実しており、複数のパッケージに跨がるビルドや他のrosパッケージの検索、Node(プログラム)の立ち上げ用のrosコマンド(bashコマンド)が全て用意されています.

全てのNodeの管理を行うroscoreも上記のコマンドで立ち上げることができます.その際には立ち上げた環境でのパラメータを全て管理するパラメータサーバも立ち上がります.

roscoreを立ち上げた後で他のrosのNodeを立ち上げていきます.通常のプログラミングをしたコードに少しそれ用のライブラリの関数等を追加するだけで簡単にROSのNodeにすることができます.

Node用のライブラリというの以下のように、非常にシンプルな機能のみを提供します.対応している全てのプログラミング言語でそれぞれの言語用のNode用ライブラリを用意しています.
Nodeは初めにroscoreと通信して自身がROSのネットワークに参加することを告げます.その後は自身がデータを受け取ったり渡したりするros用の通信口を用意して他Nodeとデータを渡し合います.
画像 : Node用のライブラリが提供する機能

それでは最後にもう一度まとめておきます.
ポイント : ROSが提供するソフト
  • roscore : 全てのNodeの通信のサポートなど.
  • パラメータサーバ : 全Nodeのパラメータを管理、反映
  • Node用ライブラリ : ROSのNodeにするライブラリ
  • ros用のBashコマンド : rosのNodeを立ち上げたり調整したり、パッケージを管理したり、開発するのに便利コマンドが多数
Step
4
ROSV2との違いや状況
ROS2はROS(v1)がリリースされたころから、ROSに求められることが大きく変わったことを受けて新しくROS(v1)とは別のソフトとしてリリースされました.ROS2では複数のロボットを使い、リアルタイム性や貧弱なネットワークなどの前提に対応するためにROS(v1)を拡張せずに作り直しています.

上記の背景がありながらROS2とROSで研究として実現できることに大きな差はないため、多くの研究者にとってはROS2への移行のメリットは薄かったようです.移行は緩やかに進む程度のようです.

Done