なぜいきなり作り始めちゃうの?
もし、「ロボットシステムを設計してください」と言われたら、まず、何をしますか?
CADでロボットの機構を設計し始める?部品を探して買い集め始める?ROSのソフトウェアパッケージを作り始める?
最初にやることとしては、どれも間違いです。設計というのは、なにかを作る前の、なにも形になっていない状態で、これから作るものを他の人に示して説明するためのものです。あたりまえですよね?
しかし実際には、いきなり作り始めちゃう人が多すぎるのです。この記事はそういう状況に対するいらだちから出てきていて、あたりまえと思われることもちゃんと言語化して共有しないとダメなんだな、と最近思っています。これからいくつかの記事で、ロボットシステムを設計する際に私が意識していることを共有したいと思います。
ちなみに、自分1人でロボットを作る場合には設計とかいらない、という意見には同意です(ほかの人に説明する必要がないからね)。でも普通はチームでロボットを作るので、その場合、システムの設計作業をおろそかにすると、ほぼ確実に空中分解するでしょう。
ロボットとロボットシステム
「システム」と呼ばれるものは世の中にはたくさんあり、その設計法についてはいろんなノウハウや研究がされています。しかし、それらを大学の研究室で学ぶことはなかなかないと思いますし、私自身もあまり学んだ記憶がありません…
その中でもロボットのシステムは以下のような特徴を持っています。
- 現実世界の環境で動作すること
- ハードウェアとソフトウェアの組み合わせであること
- 状況に応じて行動が変化すること
「ロボット」を厳密に定義することは非常に難しいですが、「よりロボットらしい」「あまりロボット的でない」という方向性を考えることはでき、これらの特徴は「ロボットらしさ」を表しています。
ロボットシステムの設計について考える前に、まずはその特徴について以下に一つずつ見ていきましょう。
現実世界の環境で動作すること
ロボットは一般的に現実の世界で動作します。計算機の中で完結するものはロボットとは呼べないでしょう。(異論はあるかもしれないですが、とりあえず話が進まないので…)
現実世界といっても、ロボットが動作する空間は非常に多様です。工場なら安全柵にかこまれてほとんど変化のない空間で動き続けることが多い。レストランやビルで働くロボットは、その建物の中は自由に動き回れます。屋外を駆けるフィールドロボットは空が続くかぎりどこまでも行けるかもしれません。
一般的に、ロボットが動く環境をちゃんと定義できれば、ロボットシステムの設計はだいぶ楽になります。環境が広い、もしくは、完全に開いている(つまり、どういう環境でも動作することがありうる)場合には、非常に難しくなります。
ハードウェアとソフトウェアの組み合わせであること
現実世界で動く、という特徴と紐づいている条件として、ロボットはハードウェアを持っています。しかし、ハードを持っていればすべてロボットかというとそうではなく、ソフトウェアでふるまいが変わらないのであればそれはどちらかというと「機械装置」と呼ぶべきですね。
このようなシステムでは、機械のみ、電気系のみ、ソフトウェアのみの範囲で最適な構成を考えても、全体として最適なものにはなりません。いろんな制約を考慮しながら、各分野の組み合わせでもっとも良いものを設計していく必要があります。
ここに、ロボットシステムの難しさと面白さがあります。ロボットシステムを設計する人はハードウェアもソフトウェアも、どちらも知っている必要があり、それらを同時に考える必要があるのです。
状況に応じて行動が変化すること
たとえば「料理をするロボット」があるとします。仮にそのロボットが毎回、同じ材料しか受け付けず、同じ動きをして、同じ味のチャーハンしか作れないとすると、それはロボットでしょうか?
もし、材料だけを渡されて「適当に美味しいもの作って」と言われて、それを実現できる機械があれば、それは非常にロボットらしいと言えます。
これらは、ロボットが状況を認識し、行動を変えることにより目標を達成できるかの違いです。多様な状況に最適に対応できるシステムが、より「ロボット的」で「知能的」であるといえます。ロボットシステムは究極的に「機械による知能」の実現のためのシステムと言えるでしょう。
ロボットシステム設計の手順
さて、ロボットに限らず、システムを設計する場合には、以下の流れになるはずです。
- 要件定義(Requirements)
- 全体設計(System-wide Design)
- 分割統治(Divide and Conquer)
次回以降の記事で、特にロボットシステムの場合にどういうことに気を付けなければならないかを詳しく見ていきます。