ロボット基礎技術

[| ]  最終更新: 2018/04/17 19:43:03

心 得

ここまで、ロボットの動作を検討するための、代表的な理論を扱ってきました。 しかし、ロボットを実現するためには、理論に加えて様々な技術が必要になってきます。 そこで、ここでは、ロボットを構成するための基本的な技術にふれます。

ロボットの構成要素

ロボットを構成する要素は、大きく分けて三つです。 別の見方では、 とも分けられます。 これまで扱ってきた理論は、主に三つ目のソフトウエア的な部分に組み込まれ、またロボットを設計するときに必要となるものであって、実際につくるとなると、さらに多くの知識、経験を動員する必要があります。
たとえば、車輪移動型ロボットを例にすると、作るまでには などなどが必要となります(実際には簡単には区分できず密接に関連するものが多い)。 もちろん、ロボットの規模によって異なりますし、一つ決めると連鎖して決定される要素もありますが、たったモータ2個のロボットであっても、様々な要素がでてきます。

以下では、それぞれの要素について簡単にまとめていきます。


ロボットの駆動系

アクチュエータ

ロボットに動きを産み出す駆動装置をアクチュエータといいます。

出力を得る方向の分類:

一般に、回転出力のものはその回転回数に制限はありませんが、ぜんまいのようなバネ系の要素が入っているもの、バネ+電磁石のような構造のものは往復運動になります。 直動については、一般には往復運動です。 石川研のリニアパラメトリックモータのようなモータ、リニア地下鉄のモータなどはリアクションプレート(コイルと対になる金属板)さえあれば一般的な感覚の「往復」のサイズよりも長い運動ができます。

エネルギー源の分類:

いまの主流は電気で、産業用には交流系が主流になっているようです。 電気を使うときは一般にコイルで磁力にして、最終的には磁気的な吸引反発で力をだしますが、電圧を直接力として使う静電気力は、「小さな世界」でしばしば用いられます(磁気よりも支配的になるため)。 油圧は大出力を使うところでもっぱらつかわれます。

動作のリニアさ:

制御のしやすさを考えると、線形さが非常に重要です。 そのため、ロボットに用いるモータは、おもちゃにつかう模型用マブチモータとは異なり、線形性を重視した設計になっています。 具体的には、マブチモータが3極モータ(コイルが3セット)なのに対して、サーボモータは極数が大幅に増やしてあったり、コイルを巻く鉄芯の形の設計、コイルの巻き方を工夫してあったりします。 このようなモータは「サーボモータ」と区別して呼ばれます。 なお、サーボモータという場合、電子回路もセットで、ラジコンで使われる「ラジコンサーボ(モータ)」を指すことも最近は増えてきたので、意識して区別する必要があります。
(サーボ制御で使うモータ/サーボ制御されたモータ)
リニアじゃないのはロボットに使えないかというとそうでもなく、例えば手先を開く/閉じるだけでいい場合などは単純にオンオフだけできればいいアクチュエータを使うことがあります。

サーボモータ

制御しやすいように線形性を重視したモータで、直流サーボモータと交流サーボモータがあります。 交流サーボモータは回転に応じた交流電流を適切に流す必要があるため、扱いがやっかいで、専用の駆動回路とセットで使うことが一般的ですが、直流サーボモータは直流電流を流せばいいだけなので、自前の適当な回路でも簡単に回すことができます。
ちなみに、たとえば24V用のサーボモータが乾電池一本でもゆっくりですがなめらかに回るくらい、リニアです。

電磁石系のアクチュエータ全般に言えますが、その出力トルク(力)は電流に比例します。 直流サーボモータの基本となる式は、
T=K_T i
と表されます。ここで、比例定数 KTはトルク定数などと呼ばれます。

磁界の中でコイルを動かすと、コイルには電圧が発生(誘導)します。 モータに電源をつなぐかわりに、モータを外部から回転させると電気が発生する=発電機になるということはこれによります。 これはモータに電流を流して回転させているときにも同じことが起きていて、逆起電力と呼ばれています。逆起電力は
E=K_E \dot{\theta}
と表され、回転角速度(一般には、1分あたりの回転数RPMでスペック表記)に比例した電圧が発生します。

モータを電子回路的に見ると、コイルなどの電気抵抗、コイルのインダクタンス成分、それに逆起電力を発生する電池が直列につながったように表すことができます。 その端子電圧は
V=Ri+L\dot{i}+K_E \dot{\theta}
となります。ここで、R,Lはモータの等価的な抵抗、インダクタンス成分です。

以上の3つの式を組み合わせるとモータの特性を説明できます。
たとえば、止まっているモータにある電源をつないだとき、キュィィィンと加速して、ある回転数に落ち着きます(こういう基本的なところはサーボモータもマブチモータも違いなし)。 これは、電源をつないだ直後は角速度が低いため、モータのコイルにはほぼ V/Rの電流が流れ(コイル分の影響は一般に瞬間的に大きいのみ)、KT倍のトルクが発生します。 このトルクで、モータ自身、その先のメカを加速します。 その結果、徐々に逆起電力が増加してきます。 最終的には、「摩擦力とトルクが釣り合う電流」にRを乗じて電源電圧からひいた電圧=逆起電力となるところで、加速が止まります。

モータというと、なんとなく電圧を入力する部品に思えますが、このように電流を入力する部品です。 そのため、モータを本格的に駆動する場合には、電流でモータを駆動できるような回路をつくります(電流を検出して、目的値になるように電圧をフィードバック制御)。

ステッピングモータ

コイルがいくつかあり、それに順次電流を流すと、一定角度ずつ回転するモータです。 コイルごとにはパルス的な電流がくるので、パルスモータとも呼ばれます(他、ステップモータなど)。 よくあるスペックとしては、コイルが4本、1ステップ1.8(=360/200)度などです。

このモータの特徴は、狙った角度の回転が簡単なことです。 コイルを一回切り替えるごとに1ステップずつ回転するため、目的の角度をステップ角度で割った回数だけ通電切り替えをすればいいわけです(切り替え速度を決めれば、速度を決められる)。 それに対して、電流を流すと回る普通のモータは、別途回転角度センサをつけて、それをフィードバックしなければ目的の角度を出すことはできません。 このフィードバックが要らない(オープンループ)、狙った角度、速度が出しやすいという特性を活かして、駆動系の簡略化を測る目的でステッピングモータが使われることがよくあります。 身近な例ではプリンタのへッドを左右に動かしたり、紙送りをするところにはステッピングモータがよく使われます。
そのほか、一つのコイルに電流を流しっぱなしにすれば、一定の角度でホールドできるという特徴もあります。また、回転速度は遅いかわりにトルクが案外大きいため、減速系を省略できることもあります。

ただし、欠点もあります。

最後の脱調というのはコイルの切り替えにトルク不足などで回転が追い付かない状態になったとき、ごそっと目的の角度からずれがでることです。 条件によっては回転が停止します。 ステッピングモータはオープンループで使うために採用されることが多く、センサがついていません。 その場合、脱調したことも操作側はしらないことになります。 このような欠点のため、ステッピングモータは、電力に余裕があり、多少重くともかまわず、それほど負荷が大きくない用途に用いることが一般的です。 ただ、扱いが非常に簡単であるため、簡単に車輪移動ロボットを作る際などに用いられます。

リニアモータ

リニアモータは、一般にモータというと回転式なのに対して、リニア(直線の)モータです。 また、モータならその駆動原理を問わずに直線にしたらリニアモータです。 このあたりは非常に社会的には誤解を招いているところで、仙台市で導入しようとしているリニア地下鉄が磁気で浮いたり地上側にコイルをたくさん並べるから高くなると主張する人がわりといたりします。 原因はマスコミが「リニアモーターカー(磁気浮上式鉄道)」なんて書きまくったことでしょうが...。

リニアモータにもいくつかの方式がありますが、

の様式がメジャーです。

リニアモータの特徴は、「最初からリニア」ということです。工作機械など、直線運動が要求される機械は案外あります。 従来は、回転式のモータとボールネジ、台形ネジなどの回転−直動変換機構で構成していましたが、こういうメカが介在するとどうしてもガタがでます(ガタは必須)。 そうすると動作にずれがでたり、力のかかり方の変化のたびにガタの分だけ動いたりと不都合がでます。 最初からリニアならこういう問題はおきません。 そのため、工作機械などで使われ始めています。
欠点は、現在のところ出力のわりに重く、制御装置も専用のものが必要であるため、ロボットにつむにはまだ不適であること(たとえば、パトレイバーのAV98式は超伝導リニアモータ(SCLM)駆動なんですけど)があげられます。また、回転式のモータはしっかり入れ物にいれられますが、リニアモータは一般に剥き出しなので、たとえば工作機械の場合は切屑がひっつかないようにとか気を使うことです。

ちなみに、鉄道にリニアモータが使われる理由はちょっと違います。 現行の鉄道では、駆動も制動もレールと車輪の摩擦力に頼っています。 両方とも鉄であるため、耐久性も走行抵抗も低く押さえられますが、鉄同士の摩擦はそれほど大きくなく、すべらないようにするには駆動力、制動力に制限がでます。そのため、あまり急勾配(人間や自動車にはあまり急ではない)にもできません。また、高速運転する場合も空気抵抗に打ち勝つだけの駆動力を出すのがたいへんになります。 これがリニアモータになると、車輪は支えるだけでよくなり、駆動力はダイレクトに発生させるので、こういう制約がなくなります(いわゆる磁気浮上のリニアモーターカーは加えて、浮かせることで地上との摩擦を低減)。 そのため、町中からいきなり青葉山を上ることで急勾配になる仙台市の地下鉄東西線では、従来のものより有利と考えられています。 ついでに、車輪もある程度小さくできるし、床下の機器も小さくできるしで、トンネル断面が小さくなって安上がりという効果もあるようです。

油圧/空気圧

油圧というのはお馴染の油圧です。 ただ、建築機械のようにレバーで入切するだけではなく、制御用にはサーボバルブというリニアに細かな制御の効くバルブで油の圧力制御をします(電流に比例とか)。 電気式モータの高性能化とロボットの自立指向化に伴い、最近はロボットのアクチュエータとしては見掛けなくなってきましたが、用途によっては使われています。

油圧の特徴は、油圧の発生源と、実際に動作をするアクチュエータの部分を分離できることです。 この油圧の発生源であるポンプが大きく、重くなり易いためにロボットに積むことは容易ではありませんが、「積まない」ことにしてしまえば、アクチュエータの単位重量辺りの出力が大きなものと見なすことができます。 もちろん、油圧のホースをロボットまで引っ張る必要があるので、自立ロボットにはなりません。 この単位重量辺りの出力の大きさのため、以前は人型の歩行ロボット(早稲田大学)につかわれたこともありますし、本体を軽くする必要のある跳躍ロボットKenken(東北大学)にも採用されています。

同じように圧力を使うものに水圧、空気圧があります。 水圧は本質的には油圧と同じです(吹き出しても汚れないけど、ものが錆びる)が、空気圧は異なります。

ロボットではあまり使いませんが、空気圧はタービンと組み合わせると他のアクチュエータに比べて高速回転が可能です。 歯医者の削る機械はあの先に小さなタービンが入っていて高速回転します。 また、機械工作用でも、高速切削用にそういうタービンがあります。

動力伝達機構

モータの動きは一般にそのままでは使えないことが多く、何らかの伝達機構を介在させます。 特に、多くのサーボモータは回転数は高い一方、トルクは小さめなので、なにか作業をさせる場合には減速機で回転数をトルクに変換する必要があります(回転数×トルク=動力=電力)。
(特殊な例では高トルクに設計したダイレクトドライブモータという品種もあり。高めの洗濯機などにもつかわれている)

単純に回転運動のまま減速するには

などをつかいます。

運動を変換しつつ減速する場合には

などがあります。

選 定

このようにいろいろあるわけですが、目的やスキルに応じて、どんなアクチュエータ、機構を使うか選んだら、今度はその詳細な選定が必要です。

アクチュエータについては、目的の出力に応じて選定します。 サーボモータを採用する場合は一般にトルクが足りなくて回転数が高いということになりますので、減速系をつけることが前提です。 選定の目安ですが、駆動対象の必要とする動力、つまり最大速度×最大力or最大角速度×最大トルクをだせるモータを選定します。定常的に必要な場合は定格値を基準に、最大出力がときどき必要になるような条件の場合は定格値の2〜3倍程度(瞬間出力)を基準に選定します。 なお、このとき、減速機の伝達効率を加味する必要があります。 また、モータの専用駆動回路をいっしょに買ってきて使う場合はいいのですが、自作する場合は回路が供給できる電圧、電流によっても制約を受け、モータの性能が十分発揮できないことがあるため、注意が必要です(逆に、制約にならない回路を作るときは保護機能に注意)。

機構については、速度が問題になることはあまりなく、減速比、力、トルクに耐えられるかが主な条件になります。 まず、モータの回転、トルクと駆動対象での条件を合わせるために減速比を設定します。 加えて、減速機にはかならず許容トルクなどがあるため、ロボット全体の仕様から概算される最大出力トルクに余裕を見て選定します。 もっとも、許容トルクの大きな減速機は一般に重く、その分ロボット全体が重くなって必要な出力が大きくなってと悪循環に陥ることはよくあります。

こういったことを考慮して、ロボットのメカを設計する必要があります。


ロボットのセンサ系

ロボットを作る場合に、センサが全くないというケースは稀です。 ラジコンサーボのような、センサ&制御回路内蔵の賢い?アクチュエータを使用する場合や、ステッピングモータを使った簡単なロボットの場合はセンサがないこともありますが、多少でも状況判断を加える場合は、その情報を得るためのセンサが必要になります。

センサは大きく内界センサと外界センサにわかれます。 内界センサはロボット自身の状態を知るためのセンサで、外界センサはロボット外の情報を知るためのものです。

内界センサ(関節角度、姿勢、加速度)

ロボット自身を知るための内界センサは以下のようなものがポピュラーです。


ロータリーエンコーダ

ロータリーエンコーダの模式図 サーボモータに最初からセットで搭載されることの多い角度センサです。 軸に、スリットを等間隔に多数切った円盤をとりつけ、スリットを光センサなどで読み取ります。 光センサの出力は回転量に応じてオンオフを繰り返すため、その回数を数えれば回転量を得ることができます。 その角度分解能はスリットの数に依存し、一般的にモータ制御に使われる範囲では 200-2000程度です。
ただ、それだけでは回転角度が変わったこともわかりませんし、スリットのそばで小刻に動いても回転したことになってしまいます。 これを区別するため、普通は位置をずらして2個のセンサを取りつけます。 その位置関係を工夫すると、cosとsinのように、位相のずれた信号を得ることができ、その位相もチェックすることで、回転方向がわかります。 これを2相のエンコーダといい、一般にA相、B相といいます。 それに加えて、C相とか、Z相と呼ばれる、軸一回転につき1パルス出る出力があるものもあります。 この信号をつかうと正確に原点を出すことができるなど、便利です。

ちなみに、玉の入っているマウスには、このエンコーダの小さいのが入っています。
ちなみに(2)、サーボモータ用のエンコーダは案外電気を食うものがあります。電源容量に気をつける必要が場合によってはあります。

ポテンショメータ

ポテンショメータ(回転)の模式図 ポテンショメータは直訳すると「位置計」なので、方式までは文字には入っていませんが、一般にポテンショメータというと位置に応じて抵抗が変化する素子のことが多いです。

ポテンショメータには回転式と直動式があります。 いずれの場合も、一般的なものは、抵抗板とそこをこするブラシ(擦動子)です。 抵抗板の両端には固定の電極(図A,B)がついていて、ブラシ(C)と両端の電極の間の抵抗値(A-C or B-C)が、ブラシの位置によって変化します。 この抵抗変化を一般には電圧変化として取り出します。 回転式はこの板が円状(角度の大きな扇形)に取りつけられ、直動式は単に長方形の抵抗板です。 この方式の問題点は「こする」という動作のため、なんども動かしているうちに接触が悪くなったり、雑音が出たりします。 オーディオのボリュームは基本的には同じ作りの部品で、これもまた古くなってくるとつまみをまわすとガリガリいったりしますが、それと同じことがおこるわけです。

この問題を解決するために非接触のポテンショメータもあります。 軸には磁石を取り付け、そばに磁気で抵抗が変化する素子(MR素子,Magneto-resistive)を取りつけます。 この場合、寿命が非常に長くなり、また擦る摩擦力がなくなるため回転が軽くなります。

いずれにしても、その構造から、ポテンショメータは回転式であっても無制限には回転できません。 一般には角度と抵抗変化が直線的になる部分が±45度などと、制約があります。 また、機械的には可能でも、一回転させると値に継ぎ目ができたりします。 そのため、ポテンショメータを関節角度の測定に使用することはできても、多回転のモータの測定には使えないことになります。

ジャイロスコープ

ジャイロスコープと言った場合、普通は回転のセンサです。 そのうちで、単にセンサの「ジャイロ」と言った場合は、角速度を検出するためのレートジャイロを一般的に指します。 このレートジャイロはいくつか方式がありますが、圧電素子を用いたものが一般的です。 圧電素子とは電圧を加えると変形して、逆に変形させると電圧が発生する素子です。 腕時計のアラームやゲームウォッチ(古っ)のぴっという音を発生させるスピーカも圧電素子、電子ライターの火花を飛ばすための電圧発生も圧電素子です。 この圧電素子に交流電圧をかけて振動させます。 その状態で角速度を与えると、コリオリ力によって振動方向が微妙にずれがでます。 そのずれを検出することで、角速度を得るという方式です。 小型で手頃なので、カメラの手振れ補正やカーナビなどにも使われています。

その他、昔ながらのコマが回るジャイロスコープのタイプのものもあります。 また、リングレーザジャイロ、光ファイバジャイロという、レーザ光線で右回りと左回りの輪をつくって、回転させたことで生じる速度差を利用して測定します。非常に高精度ですが、非常に高価です。

レートジャイロはその出力を積分しなければなりません。 しかし、センサ素子は一般にゼロ点はずれるものと思う必要があります。 製造上避けられないずれは、静止状態で測定すれば得られますが、温度変化することで発生するずれ(温度ドリフト)などもあり、使いはじめてしばらくするとずれています。 積分して使うということは、この誤差も積分してしまうことを意味します。 たとえば、0.1度/s というずれができたとき、10秒たったら1度ずれます。 だいたい角度を測りたい用途では1度の角度誤差でも困ることが一般的です。 そのため、平均的に角度がゼロであることがわかっているような用途では、ハイパスフィルタを用いて直流に近い成分を捨ててしまいます。これによってずれの影響を低減できます。 そうでない場合は、傾斜計、加速度計などの重力方向がわかるセンサや、地磁気センサによって補正を行う必要があります。 この場合、あくまで「補正」でジャイロが主役です。 傾斜計、加速度計も応答性がいいものはありますが、どちらも「加速度」を計測するセンサであるため、重力の他に、ロボットが移動する加速度もひろってしまいます。 そのため、そのまま傾斜角度としてつかうとトラブルの元です。 歩行ロボットの場合は、小刻に加速度がゆれますが、全体的には加速し続けることもないため、うまく補正ができます。

参考:圧電ジャイロの技術@村田製作所

加速度センサ

加速度センサは一般に、センサ内部に加速度による慣性力をうけて変位する小物体と、その変位を測定するためのセンサからなっています。 昔はメカ的に作られていましたが、最近は半導体加工技術の進歩によって、半導体としてつくることが出来るようになり、小型、高性能、手軽になりました。

加速度センサはその検出レンジで大きく2系統にわかれます。 一つは加速度センサとしてつかうもので、検出の上限は重力加速度の数倍、分解能は1/100程度などです。これはロボットの姿勢センサとしてもつかえます。 もう一つはどちらかというと衝撃(衝撃は瞬間的な大加速度)の大きさを検出するセンサで、重力加速度の数十〜数千まで測定できますが、もちろん細かくは測れません。 用途に応じてどちらかを選択する必要があります。

外界センサ

ロボットの周囲、および周囲との接点の情報を得るための外界センサには以下のようなものがあります。


超音波距離センサ

超音波測距 もっともポピュラーな移動ロボットの外界センサの一つです。 どのくらいポピュラーかというと、障害物をよけながら動くロボットのおそらく5割以上が装備しているのではないかというくらいポピュラーです。
使われるのには理由があります。

原理は、ごく短時間(1msとか)の超音波(一般には40kHz)を送信機からとばし、対象に当って跳ね返ってきた音を受信機で受けて、送信からの経過時間を測定します。 時間差をΔt、音速をVとすると、
l=V \Delta t/2
で求まります。ここで、最後の/2は往復なので、片道に直しています。 音速は厳密には温度の関数(331.5+0.6*温度)なので、厳密さが必要ならば補正する必要があります。

この方式の利点はその単純さから、コスト的にも利用しやすいという点です。 ただし、いくつか欠点があります。 まず、音を使うのでうるさいところではつかえません。 最悪の場合、ロボット自身が出す音で誤動作することがあります。 また、屋外でつかうと風の影響を受けることもあります。 出力の面でも、音速の面でも、簡単に実用になる距離はせいぜい5メートルくらいです。 出力をあげれば、それ以上の測定もできますが、今度は時間がかかるようになります。 たとえば、東北大学江村研で開発した装置は大出力の超音波を出して、最大で50メートル先の障害物を発見できます。 しかし、それには0.3秒ほどかかります。 つまり、余裕を見ると秒2回くらいしか測定できないことになります。

超音波の距離測定の発展版としては、送信音波をパルスから符号化した信号に変更して、雑音の影響を受けにくくする方法が提案されています。 また、複数の受信機をつかって、その時間差から反射してきた位置=障害物の位置を検出する方法も提案されています。

参考:超音波距離測定の原理@キーエンス

三角測量型光距離センサ

三角測量の基本原理 光を使った距離センサには超音波同様、発射してから返ってくるまでの時間を測定する方法もあり、長距離を測定するのに適していますが、簡単に作れるものではなく、販売されているものも安くて数十万円です。
それに対して、光の直進性だけを利用する三角測量のセンサがあります。

まず測定対象に光を発射します(パルスの必然性はなし)。 次に、対象から返ってきた光が、PSD(Position Sensitive Detector)などの「光が当った位置がわかるセンサ」をつかって、どの方向から返ってきたかを調べます。 遠くからの反射光であれば、発射した光とほぼ平行に返ってきます。近くで反射すれば、角度を持って返ってきます。その角度と距離は一対一に対応するため、距離がわかるという仕掛けです。

この手のセンサは以前は高価だったり扱いにくかったりしたのですが、3年ほど前に距離測定モジュールとして、電源をつなげばすぐに距離が電圧で得られる小型のセンサ部品が開発されました。 数百円という値段の手頃さと扱いやすさから、移動ロボットのセンサとして急速に勢力を拡大しています。 参考:三角測距式の原理@キーエンス

カメラ

カメラを用いる場合、映像はコンピュータに取り込んで処理しますが、映像として使うことはあまりなく、その中のひとこまを切り出してきて画像として使うことが一般的です。 処理したあとで前後のコマの処理結果とつきあわせて、動きを求めることはあります。

画像の処理によって得られる情報は膨大です。しかし、その情報の信頼性という観点では、単純なセンサに及ばないことはよくあります。 そもそも、画像は非常に多くの情報を含んでいます。 含まれる情報が多く、複雑に混ざってしまっているために、単一の情報を確実に分離することが困難なわけです。 人間の得る外界情報の9割以上は視覚に頼っているともいわれ、人間並みの視覚を実現できたら、ロボットにとってはバラ色です。

画像の利用の一つは、1枚の画像による形状や表面、模様などの認識/確認です。 たとえば、道路の風景から交通標識を見つけ出して、制限速度を読み取るといった用途、 工場の製造ラインで製品が正しく組上がっているかをチェックするシステム、 また、農作物の品質分類などにもつかわれています。 このなかで、道路はやっかいな例です。周りになにがいっしょに映るか、明るさやコントラストはどう映るかが全く未知です。 そのため、いまもって、これだという方法は提案されていません。 さまざまな状況に対応はできますが、どんどん手法がややこしくなってしまいます。 それに対して、工場や屋内では、明るさを適切な固定値に設定でき、また周りに映るものも固定であるため、かなり実用的に使うことができます。

ステレオビジョン もう一つは複数の画像や、単一画像とスリット光などの特殊光源を組み合わせ、三角測量で画面全体や特定の対象までの距離を測定する手法です。 上述のPSD系のセンサは一点についての測定ですが、2枚の画像で同じものがどこに映っているかを同定できれば、同じように三角測量ができます。
たとえば、右図のように2個のカメラで対象物(○)を観測した場合、撮像面にはそれぞれ違う位置に映ります。 このずれ(視差)や、映った位置をもとに距離と方向を得ることができます。 ただ、その両カメラに映る同一物の判定がやはりたいへんです。 特徴のないノッペリした面は対応が取れません。 逆に物体の境界は特徴豊富なものの、奥にあるものが異なって脇に見えてしまうため、やはり対応がとりにくくなります。 また、画像の処理は根本的に繰り返し量が多いため、時間がかかります。 人間がみればいっぱつなのに...と、こういう処理をやるとつくづく人間に感心してしまいます。
代表的なセンサについてまとめてみました。 実際にはもっといろんな種類のセンサがあります。 ロボットをつくるのでなくとも、なにかの計測をするという場合は将来もあると思いますので、どんなセンサがあるかを知っておくだけでも、なんならかの足しになると思います。


ロボットのコンピュータ&ソフトウエア

ロボットを制御するには、コンピュータが必要です。 電子回路だけでもある程度のことはできますが、修正が面倒だったり、ちょっとした判断をするにも手間がかかります。 その点、センサやアクチュエータをすべてコンピュータに接続して、あとの処理をソフトウエアで行うようにすると、複雑な処理をしやすくなったり、なにかあったときにプログラムの修正で済ませることが出来るようになります。

コンピュータ

ロボットに積むコンピュータは、小さいものから大きいものまで多種多様です。 大きく分けると、マイコン系とパソコン系にわけられます(独断)。

パソコン系は文字通り、ロボットの中にパソコンを積んでしまいます。 といっても、箱形のパソコンをつむわけではなく、パソコンと同等の機能を持ったコンピュータ基板を積みます(一般のマザーボードをつんでしまうこともよくありますが)。 この場合、演算処理能力はかなり高く、また画面などをつけやすいため、対人情報の入出力は非常にやりやすくなります。 ネットワークなどにも容易に対応できます。 そのかわり、どうしても大きめであること(小型にしたものもありますが)、大きな電源を要求することが面倒な点です(普通のパソコンは+5,+3.3,+12,-12で20Aとか要求することがある)。
そのため、パソコン系は大きめのロボットで重さや電源に余裕がある場合で、複雑な処理が必要な場合に採用されることが多いようです。

マイコン系は四則演算のみの電卓並から、パソコンに匹敵するようなものまで非常に幅広い品種がありますが、多くの場合はLSI一個でほとんどの処理ができるようにコンパクトにまとめられています。 特徴は

パソコンの場合は、だいたいは予算の許す範囲でCPUとかメモリの容量を見て買いますが、マイコンの場合は入出力機能なども含めて選定します。 実験室で使う分には大きめのを買えばよいのですが、量産しようと思った場合には過剰スペックがコストに直接跳ね返るため、ぎりぎりのものを選定します(聞くところでは、最初にマイコンが渡されてこれで収まるように、と言われることもあるとか)。

そのほか、ロボット本体は最低限の機能だけ(場合によってはメカとセンサだけ)にて、電線をひっぱったり、無線で指示を飛ばしたりして、高度な処理はすべて外部でおこなってしまうという構成もあります。 量産したり手軽な本格運用するためには、システムが二つあることは不利ですが、ロボットの開発段階ではいろいろと便利です。 ロボット本体を単純化できるため、メンテナンスが簡単なほか、重量制限を気にせずにいろいろな機能を盛り込むことができます(もちろん、単体にするにはその小型化が別途必要)。
また、一般にマイコンを搭載した場合はソフトウエアの修正作業が、パソコンの上でプログラムをつくってそのまま実行するのに比べて手間がかかり、実行中のソフトウエアの状態を監視することも困難です(最近はかなり楽になりましたが)。 ロボット外においたパソコンでプログラム作成&制御をすると、このような開発作業が簡単になります。
最近では大きめのロボットはパソコンそのものを積んでしまうことが多く、このような場合はネットワーク経由でログインして、その上で開発や監視作業をできるようになっていて便利です。

インタフェイス

本来、コンピュータは計算することしかできないため、外になにかをつけようと思った場合にはインタフェイスと呼ばれる回路を別途追加する必要があります。 たとえば、パソコンの場合は画面に映像を出す回路、キーボードやマウス、プリンタなどとやりとりする回路、ネットワークの回路などです。
ロボットを制御するためには、一般に次のようなものが必要です。

これらのインタフェイスの扱いは、パソコン系とマイコン系で大きく異なります。
パソコン系は、パソコンとしての入出力は標準で備えているものの、ロボット用の入出力は普通は皆無です。 そのため、これらのインタフェイスボードを増設する必要があります。
参考:アドテックシステムサイエンス  株式会社インタフェース
一方、マイコン系はマイコンを買ってくる段階で必要な機能を備えたものを選定します。 マイコン系は最初からこれらの機能を内蔵していることが一般的である反面、外に追加することが困難だったりコストパフォーマンスが大幅に低下したりすることが多いためです。
たとえば、ロボット工作でもっともメジャーな部類の、ルネサステクノロジのH8/3052というマイコンの場合、パラレル入出力が数十本、ADが10bit×8、DAが8bit×2、カウンタおよびPWMを扱うユニット(ITU)×5、通信(RS232C型)×2といった性能をもっています。 これで機能が余る場合は量産目的ならより小機能のマイコンを選んできますが、プログラムは大きくは変わりません。一方、足りない場合はやっかいです。3052はH8シリーズの中でも機能がもっとも多い部類なので、これより増やすことは困難です。その場合はロボット側を工夫して必要な機能を減らす、複数のマイコンを連携させて使う、などを考える必要があります。

ソフトウエア

ロボット用のソフトウエアというのは、非常に多岐にわたるため、それだけで講義が1セットできてしまうくらいです。 ただし、その根底にある概念は二つです。

ロボットの制御は、モータなどのフィードバック制御と、より上位の判断を下す部分からなります。 モータのフィードバック制御は制御工学で習うような手法、PD制御、PID制御、状態フィードバックなどをプログラムで行います。 ところが、これらの理論は基本的に時間が連続であることを前提にし、微分や積分を使います。 それに対して、コンピュータで制御演算を行う場合はどうしても時間は有限です。 「センサで状態の取り込み」→「制御演算」→「出力」で処理には時間がかかります。 そのため、一般にはこれらの処理を一定の時間間隔(Δt、サンプリング周期、制御周期)で行うことにします。 そのため、時間の関数 x(t) は時間とびとびのデータになって「i番目のデータ」x[i]になります。さらに、
\frac{dx}{dt}[i]&=&\frac{x[i]-x[i-1]}{\Delta t}\nonumber\\ \int xdx&=&\sum^{i}_{k=0}x[k]\Delta t
で代用します。 このため、処理間隔が一定であることが重要になります。

一定間隔で処理を行うためには、いくつか手法があります。 やるべき処理がこの一定時間間隔の処理のみならば、一回処理してから次の処理までひたすら時計を見ながら待つ、という方法があります。 たとえると、10分おきにデータを取るために、時計をにらみ続けるようなものです。
ところが、実際にはそれだけで済むことはすくなく、他の仕事もしたいことがあります。 この場合は「タイマ割り込み」という手法も導入します。 タイマというのは目覚まし時計のようなもの、割り込みというのは外部からの刺激によって、いまのしている処理をいったん中断して、予め指定しておいた処理を開始させる仕掛けです。 いわば、10分おきになる目覚ましをおいておいて、普段は別の仕事をしておいて、目覚ましがなったらデータを取りに行って、終わったら元の仕事を再開するようなものです。
どちらが効率がいいかというと、後者の方が他の仕事もできて便利です。 しかしこの割り込みという手法は多少複雑で制約も多く、動作検証も楽ではないため、注意して使う必要があります。 もし本当にやる仕事が一つだけなら前者の方法が安全です。 また、二つの仕事があるとき、割り込みにする要求がでるのは一方だけです。 より簡単な処理を割り込みにしてしまって、制御本体は時計を見ながらという手があります。

実際にはさらに、処理の優先度という問題(大事な仕事の途中には割り込ませないなど)もあります。 ある程度以上システムの規模が大きくなったら、リアルタイムOS(Real-Time Operating System)と呼ばれる基本ソフトなどの助けを借りることができるようになり、これらが楽になります。 マイコン系でも大規模なものは TRONやLinux系などのOSが動作しますが、小型の場合は自分で考える必要があります。

さて、ロボットを制御する場合、ソフトウエアからインタフェイスと情報のやり取りをしなくてはなりません。
マイコン系でポピュラーな形態は、メモリの一部にこれらが見える、という形式です。 メモリは本来はデータを保管しておき必要なときに読み出してくるものですが、電気的に見れば「コンピュータから書き込みの信号を送る→その信号を保存する」「読み出しの指令を送る→前回書き込まれた値を返す」となっていて、コンピュータ側は「書く信号を送る」こと、「読む信号を送って結果をもらう」ことだけです。 それを流用して、「書き込み信号を送る→ディジタル出力 or アナログ出力(DA)」や、「読み込み指令→ディジタル入力 or アナログ入力」でもいいわけです。 もちろん、この場合はメモリとして使えませんが、読み書きの時はアドレス(番地)という操作対象を示す数値を添えて処理するため、ある番地の範囲はメモリ、ある特定の番地はアナログ入出力と分けて使えばいいわけです。 あとは、どこがメモリでどこが入出力かはプログラムをつくる側が常に意識すればいいわけです。
マイコンのデータシート(取り扱い説明書)や解説書をみると、各機能を使うための番地やなにを書けばいいか、読んだ値の意味などがずら〜っと記載されています。
なお、コンピュータの種類によっては、メモリとは別に同じような構造の入出力専用の系統(IOポート)を持っていることもあります(Intel系全般、パソコン用CPUも含む)。

パソコンの場合は、コンピュータという点ではマイコンといっしょですが、その上に乗っているOSのため、もう少し事情が複雑です。 マイコンの場合は、プログラムを作った人が責任をもってすべてを管理することが前提ですが、パソコンはより大規模で、複数のプログラムが同時に走っています。 たとえば、音楽を聞きながらWEBブラウザを使いながらワープロで文章を書きつつデータ計算、など。 この場合、それぞれのプログラムが勝手にコンピュータの機能(資源ということがあります)をいじったら、それぞれが干渉して正しく動作できなくなります。 その調停をすることもOSの役割ですが、逆に簡単にはインタフェイスにも簡単には触れなくしてあります。
そのため、パソコンでこういったOSを使っている場合は直接インタフェイスに触ることはほとんどなく、インタフェイスボードについてきたデバイスドライバ、ライブラリといったソフトウエア経由で使うことになります。 それらがないときは直接操作することになりますが、その場合もOSから特別の許可を得る必要があります。


これらの基礎の上に、ロボットの制御システムを組み上げていきます。 主な仕事は制御理論をプログラムの形にしていくことですが、数式の上の話とプログラムの上には他にも食い違うところがあったりして、それなりに経験も要求される分野です。 これを身につけるためには、まずはサンプルプログラムなどをもとに実際に触ってみるしかありません。 もちろん、C言語が使えることが前提です。 こういうハードウエア分野のソフトウエアは大半がC言語やアセンブリ言語で、より上位のソフトウエアやパソコン系のシステムになるとC++なども使えるようになりますが。

まとめ

ロボットの理論もそうですが、それよりも実際につくるための技術は文字で伝えられる情報のほかに、経験に依存する部分もあり、このページでも私の持っている範囲の1%も伝えられていないと思います。
(理論は1割以上かも:-)<基本的に理論より技術系なので)
関心を持った学生さんは専門書やネットでの情報などに触れてみてください。 もちろん、私の方でも相談にはのります。
このページに関して言えば、ロボットに限らずメカトロ全般の話であるため、今後就職してこういった分野に携わる学生さんもいるとおもいます。 ある程度は情報をいれたら、あとはやって慣れるのが一番です。 そのうちに、やりたいことが決まったら何が必要か思い浮かぶようになります。

補 遺



熊谷正朗 [→連絡]
東北学院大学 工学部 機械知能工学科 RDE
[| ]