衝突検出システム、ロボットシステム、衝突検出方法及びプログラム
【課題】衝突検出対象オブジェクトの正確な衝突判定を実現できる衝突検出システム、ロボットシステム、衝突検出方法及びプログラム等の提供。
【解決手段】衝突検出システムは、処理部と描画部と第1、第2の深度バッファーを含む。描画部は、第1の深度バッファーを参照して、衝突検出対象オブジェクトと、衝突検出対象オブジェクト以外の他のオブジェクトの描画処理を行い、処理対象ピクセルの深度値が、第1の深度バッファーの第1の深度値より所定の視点から見て後方における最前面の深度値である場合に、第2の深度バッファーの第2の深度値を処理対象ピクセルの深度値に更新する。処理部は、衝突検出対象オブジェクトの描画処理の結果に基づいて、衝突検出対象オブジェクトの所定の視点から見たときの前面と背面の間に、他のオブジェクトが存在すると判断した場合に、衝突検出対象オブジェクトが他のオブジェクトに衝突したと判定する。
【解決手段】衝突検出システムは、処理部と描画部と第1、第2の深度バッファーを含む。描画部は、第1の深度バッファーを参照して、衝突検出対象オブジェクトと、衝突検出対象オブジェクト以外の他のオブジェクトの描画処理を行い、処理対象ピクセルの深度値が、第1の深度バッファーの第1の深度値より所定の視点から見て後方における最前面の深度値である場合に、第2の深度バッファーの第2の深度値を処理対象ピクセルの深度値に更新する。処理部は、衝突検出対象オブジェクトの描画処理の結果に基づいて、衝突検出対象オブジェクトの所定の視点から見たときの前面と背面の間に、他のオブジェクトが存在すると判断した場合に、衝突検出対象オブジェクトが他のオブジェクトに衝突したと判定する。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、衝突検出システム、ロボットシステム、衝突検出方法及びプログラム等に関する。
【背景技術】
【0002】
物体間の衝突や近接の有無を判定することは多くの分野で必要とされている。例えばロボットなどの分野において、衝突の発生は非常に大きな問題となる。このため、従来より、実際に衝突が発生する以前に、衝突の有無や、許容された以上の近接を、コンピューターによる計算により判定する手法が研究、開発されている。このような衝突判定手法の従来技術としては、例えば特許文献1、2等に開示される技術が知られている。
【0003】
特許文献1の手法は、その図6のフローチャートに示されている。この従来技術では、物体(オブジェクト)の3次元の配置を、横(X)と縦(Y)の2次元位置と、その位置に対応する深度値(Z値)として記憶する装置において、プリミティブを逐次的にレンダリングする。そして、そのレンダリングの過程で同一深度値を持つもの、つまり3次元空間的に同じ位置を占めるものが現れれば、それを衝突と判定する。
【0004】
特許文献2の手法は、その図2、図3により説明されている。この従来技術では、ポリゴンの原点から、そのポリゴンのある方向の面までの距離を予め計算し、キューブマップとして保存する。そして、原点から衝突検出の対象となる物体との距離と、キューブマップに記憶された距離との大小により、衝突を判定する。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開平9−204543号公報
【特許文献2】特表2009−545075号公報
【発明の概要】
【発明が解決しようとする課題】
【0006】
しかしながら特許文献1の従来技術では、深度値の更新が、物体を描画する順番に依存するため、衝突の検出漏れが発生する可能性がある。例えば、前方側(手前側)に配置された物体を描画した後で、その後方側(奥側)において別の物体間で衝突が起こったとしても、深度値は既に前方側のオブジェクトの値に更新されているために、それを検出することはできないことになる。
【0007】
また特許文献2の従来技術では、非凸であるポリゴンの衝突を正確に取り扱うのが困難であるという問題がある。即ち、原点から面までの距離を単一のキューブマップに記憶しているため、ある方向において、そのポリゴンの面が複数ある場合、つまりそのような非凸のポリゴンの場合においては、それを単一のキューブマップとしては表現できないことになる。
【0008】
本発明の幾つかの態様によれば、衝突検出対象オブジェクトの正確な衝突判定を実現できる衝突検出システム、ロボットシステム、衝突検出方法及びプログラム等を提供できる。
【課題を解決するための手段】
【0009】
本発明の一態様は、処理部と、描画処理を行う描画部と、深度情報を記憶する第1の深度バッファーと、深度情報を記憶する第2の深度バッファーとを含み、前記描画部は、前記第1の深度バッファーを参照して、衝突検出対象オブジェクトと、衝突検出対象オブジェクト以外の他のオブジェクトの描画処理を行い、処理対象ピクセルの深度値が、前記第1の深度バッファーの第1の深度値より所定の視点から見て後方における最前面の深度値である場合に、前記第2の深度バッファーの第2の深度値を前記処理対象ピクセルの深度値に更新し、前記処理部は、前記衝突検出対象オブジェクトの描画処理の結果に基づいて、前記衝突検出対象オブジェクトの前記所定の視点から見たときの前面と背面の間に、前記他のオブジェクトが存在すると前記処理部が判断した場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突したと判定する衝突検出システムに関係する。
【0010】
本発明の一態様によれば、第1の深度バッファーを参照して、衝突検出対象オブジェクトと他のオブジェクトの描画処理が行われる。そして描画処理の処理対象ピクセルの深度値が、第1の深度バッファーの第1の深度値よりも後方における最前面の深度値である場合に、第2の深度値が、処理対象ピクセルの深度値に更新される。そしてこの描画処理の結果に基づいて、衝突検出対象オブジェクトの前面と背面の間に他のオブジェクトが存在すると判断されると、衝突が発生したと判定される。このようにすれば、深度バッファー処理を有効活用した衝突判定が可能になり、衝突検出対象オブジェクトの正確な衝突判定を実現できるようになる。
【0011】
また本発明の一態様では、前記描画部により描画データが書き込まれる描画バッファーを含み、前記処理部は、前記描画バッファーに書き込まれた前記描画データに基づいて、前記衝突検出対象オブジェクトの衝突判定を行ってもよい。
【0012】
このようにすれば、描画処理の結果として、描画データが描画バッファーに書き込まれ、書き込まれた描画データに基づいて、衝突検出対象オブジェクトの衝突判定を行うことが可能になる。
【0013】
また本発明の一態様では、前記描画部は、前記処理対象ピクセルの深度値が、前記第1の深度バッファーの第1の深度値より前記所定の視点から見て後方における最前面の深度値であり、且つ、前記衝突検出対象オブジェクトの深度値である場合には、前記第2の深度バッファーの第2の深度値を前記処理対象ピクセルの深度値に更新して、前記描画バッファーに前記描画データを書き込み、前記処理対象ピクセルの深度値が、前記第1の深度バッファーの第1の深度値より前記所定の視点から見て後方における最前面の深度値であり、且つ、前記衝突検出対象オブジェクト以外の前記他のオブジェクトの深度値である場合には、前記描画バッファーに前記描画データを書き込むことなく、前記第2の深度バッファーの第2の深度値を前記処理対象ピクセルの深度値に更新してもよい。
【0014】
このようにすれば、衝突検出対象オブジェクトについては、深度値の更新と描画データの書き込みが行われる一方で、他のオブジェクトについては、描画データの書き込みが行われず、深度値の更新だけが行われるようになる。このような描画データの書き込みを行うことで、衝突検出対象オブジェクトの前面と背面の間に他のオブジェクトが存在するか否かを判定できるようになる。
【0015】
また本発明の一態様では、前記処理部は、第1の描画処理において前記衝突検出対象オブジェクトの前面が描画され、前記第1の描画処理の次の第2の描画処理において前記衝突検出対象オブジェクトの背面が描画されなかったことが、前記描画バッファーの前記描画データに基づき検出された場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突したと判定してもよい。
【0016】
このようにすれば、第1の描画処理で衝突検出対象オブジェクトの前面が描画され、次の第2の描画処理で衝突検出対象オブジェクトの背面が描画されたことを、描画バッファーの描画データに基づき判断できるようになる。
【0017】
また本発明の一態様では、前記第1の描画処理において前記衝突検出対象オブジェクトの前面が描画された場合に第1の論理レベルになるマスクデータが生成され、前記処理部は、前記第1の描画処理で生成された前記マスクデータが前記第1の論理レベルであり、前記第2の描画処理において前記衝突検出対象オブジェクトの背面が描画されなかったことが前記描画バッファーの前記描画データに基づき検出された場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突したと判定してもよい。
【0018】
このようにすれば、生成されたマスクデータが第1の論理レベルか否かを判断することで、第1の描画処理において衝突検出対象オブジェクトの前面が描画されたか否かを判断できるようになる。そして、マスクデータが第1の論理レベルであり、且つ第2の描画処理で衝突検出対象オブジェクトの背面が描画された場合に、衝突検出対象オブジェクトの衝突が発生したと判定できるようになる。
【0019】
また本発明の一態様では、前記描画部は、前記衝突検出対象オブジェクトの前面を描画する場合には、前記描画データとして第1のデータを前記描画バッファーに書き込み、前記衝突検出対象オブジェクトの背面を描画する場合には、前記描画データとして前記第1のデータとは異なる第2のデータを前記描画バッファーに書き込み、前記処理部は、第1の描画処理において前記第1のデータが前記描画バッファーに書き込まれ、前記第1の描画処理の次の第2の描画処理において、前記第2のデータが前記描画バッファーに書き込まれなかった場合に、前記衝突検出対象オブジェクトについての衝突が発生したと判定してもよい。
【0020】
このようにすれば、例えば第1の描画処理において描画データとして第1のデータが描画され、第2の描画処理において描画データとして第2のデータが描画されたか否かを判断することで、衝突検出対象オブジェクトの他のオブジェクトの衝突のみならず、衝突検出対象オブジェクトの自己衝突等についても判定できるようになる。
【0021】
また本発明の一態様では、前記処理部は、前記衝突検出対象オブジェクトの描画処理の結果に基づいて、前記衝突検出対象オブジェクトの前面の次に前記衝突検出対象オブジェクトの背面が描画されたと判断した場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突しなかったと判定してもよい。
【0022】
このようにすれば、衝突検出対象オブジェクトの前面の次に背面が描画された場合に、当該処理対象ピクセルにおいては衝突検出対象オブジェクトと他のオブジェクトの衝突が発生していないと判定できるようになる。
【0023】
また本発明の一態様では、1画面分の描画処理が終了した後に、前記第2の深度バッファーの第2の深度値が前記第1の深度バッファーに書き込まれてもよい。
【0024】
このようにすれば、描画処理によって更新された第2の深度バッファーの第2の深度値を第1の深度バッファーに書き込んで、書き込まれた第2の深度値を第1の深度バッファーの第1の深度値として扱って、次の描画処理における深度判定処理等を行うことが可能になる。
【0025】
また本発明の一態様では、前記描画部は、無限遠の前記視点での平行投影で描画処理を行ってもよい。
【0026】
このように、一般的な三次元画像の描画処理とは異なり、平行投影で描画処理を行うことで、より正確な衝突判定を実現できるようになる。
【0027】
また本発明の一態様では、前記衝突検出対象オブジェクトは、ロボットをモデル化したオブジェクトであってもよい。
【0028】
また本発明の他の態様は、上記のいずれかに記載の衝突検出システムを含むロボットシステムに関係する。
【0029】
また本発明の他の態様は、第1の深度バッファーを参照して、衝突検出対象オブジェクトと、衝突検出対象オブジェクト以外の他のオブジェクトの描画処理を行い、処理対象ピクセルの深度値が、前記第1の深度バッファーの第1の深度値より所定の視点から見て後方における最前面の深度値である場合に、第2の深度バッファーの第2の深度値を前記処理対象ピクセルの深度値に更新し、前記衝突検出対象オブジェクトの描画処理の結果に基づいて、前記衝突検出対象オブジェクトの前記所定の視点から見たときの前面と背面の間に前記他のオブジェクトが存在するか否かを判断し、前記衝突検出対象オブジェクトの前記所定の視点から見たときの前面と背面の間に、前記他のオブジェクトが存在すると判断された場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突したと判定する衝突検出方法に関係する。
【0030】
また本発明の他の態様は、処理部と、描画処理を行う描画部と、深度情報を記憶する第1の深度バッファーと、深度情報を記憶する第2の深度バッファーとして、コンピューターを機能させ、前記描画部は、前記第1の深度バッファーを参照して、衝突検出対象オブジェクトと、衝突検出対象オブジェクト以外の他のオブジェクトの描画処理を行い、処理対象ピクセルの深度値が、前記第1の深度バッファーの第1の深度値より所定の視点から見て後方における最前面の深度値である場合に、前記第2の深度バッファーの第2の深度値を前記処理対象ピクセルの深度値に更新し、前記処理部は、前記衝突検出対象オブジェクトの描画処理の結果に基づいて、前記衝突検出対象オブジェクトの前記所定の視点から見たときの前面と背面の間に、前記他のオブジェクトが存在すると判断した場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突したと判定するプログラムに関係する。
【図面の簡単な説明】
【0031】
【図1】図1(A)〜図1(C)は深度バッファー処理の説明図。
【図2】図2(A)〜図2(D)も深度バッファー処理の説明図。
【図3】図3(A)〜図3(C)は従来技術の問題点についての説明図。
【図4】本実施形態の衝突検出システムの構成例。
【図5】本実施形態の衝突検出システムを含むロボットシステムの例。
【図6】図6(A)、図6(B)は衝突検出対象オブジェクトや他のオブジェクトや第1、第2の深度値の説明図。
【図7】図7(A)、図7(B)は本実施形態の衝突検出手法の説明図。
【図8】図8(A)、図8(B)も本実施形態の衝突検出手法の説明図。
【図9】図9(A)、図9(B)も本実施形態の衝突検出手法の説明図。
【図10】図10(A)〜図10(D)は本実施形態の衝突判定の基本原理の説明図。
【図11】図11(A)、図11(B)はマスクデータを用いて衝突を判定する手法の説明図。
【図12】図12(A)〜図12(D)はマスクデータや描画データを用いて衝突を判定する手法の説明図。
【図13】本実施形態の詳細な処理を示すフローチャート。
【図14】本実施形態の詳細な処理を示すフローチャート。
【発明を実施するための形態】
【0032】
以下、本発明の好適な実施の形態について詳細に説明する。なお以下に説明する本実施形態は特許請求の範囲に記載された本発明の内容を不当に限定するものではなく、本実施形態で説明される構成の全てが本発明の解決手段として必須であるとは限らない。
【0033】
1.深度バッファー処理
ロボット(マニピュレーター)の動作においては、周辺構造物や周辺機器への衝突や、自己衝突や、他のロボットへの衝突は非常に大きな問題となる。本実施形態の衝突検出手法では、このような衝突をシミュレーションにより事前に検出する。
【0034】
このような本実施形態の衝突検出手法が用いられる形態としては、大別して、オフラインでの使用(事前確認)と、ラインタイムでの使用(予測、先読み)が考えられる。オフラインの使用では、周辺環境などが既知且つ静的であり、ロボットの動作が既知である場合に、システムの作成時に、その衝突を検証する。一方、ラインタイムの使用では、周辺環境などが動的に変化する場合(例えば周囲に複数のロボットが存在したり、作業者が存在する場合)に、ロボットの実際の動作に先行して、シミュレーションにより衝突を検出する。
【0035】
従来では、このようなロボットにおける衝突検出手法として、CPU(Central Processing Unit)の処理に適したアルゴリズムを使用する場合が殆どであった。ここでCPU処理に適したアルゴリズムとは、比較的に複雑な単位処理を、比較的に少数(数十から数百程度)の並列度で処理するようなアルゴリズムである。
【0036】
しかしながら、近年では、消費電力の問題等に起因して、CPUの動作周波数の伸びは止まっている。このため、最近のCPUの性能向上は、マルチコア化などの処理の並列度の向上によって実現されている。別の言い方をすれば、並列度を上げることができないアルゴリズムでは、処理性能を向上できなくなっている。
【0037】
一方、GPU(Graphics Processing Unit)は、CPUに比べて非常に大きな並列度を有する。例えば現在のGPUは、ALU(算術演算ユニット)を数百から千数百持ち、数万から数百万の処理を並列に実行できる能力を有する。
【0038】
そこで本実施形態では、衝突検出のアルゴリズムとして、CPU処理よりはGPU処理に適したアルゴリズムを採用することで、従来に比べて高性能な衝突検出を実現する。具体的には、GPUが有するハードウェアー機能であるROP(レンダリング・アウトプット・パイプライン)の機能を最大限に利用する。即ち、このようなROP機能を用い、深度テスト機能と深度バッファーを有効活用して衝突検出を実現する。
【0039】
ここで深度バッファーは、CG(Computer Graphics)においては主に隠面消去のために用いられ、オブジェクトの深度情報を記憶するものである。具体的にはピクセル単位で深度値(Z値)を記憶する。また、深度情報とは、ピクセル毎の深度値に係る情報である。以下、深度バッファーを用いた深度バッファー処理(Zバッファー処理)について説明する。
【0040】
深度バッファー処理では、ある点を描画する際に、その点の深度値と、深度バッファーに記憶されている深度値を比較する。そして、その点の深度値が大きければ(右手系の場合)、その点のカラー値でカラーバッファーの値を上書きすると共に、その点の深度値で深度バッファーの値を更新する。
【0041】
例えばオブジェクトOBA、OBB、OBCが図1(A)、図1(B)に示すように配置されていたとする。図1(A)はオブジェクトOBA、OBB、OBCを上方の視点から見た場合の図であり、図1(B)は前方斜め上の視点から見た場合の図である。ここでオブジェクトは、現実世界の物体をモデル化したものであり、例えば複数のプリミティブ面により構成される。プリミティブ面は、オブジェクトの構成要素であるプリミティブとなる面であり、例えばポリゴン、自由曲面、或いはサブディビジョンサーフェスなどである。
【0042】
図1(C)に示すように、深度バッファーを用いた描画処理では、各ピクセルのカラー値(RGBの色情報)が描画バッファー(カラーバッファー)に書き込まれ、深度値(Z値)が深度バッファー(Zバッファー)に書き込まれる。
【0043】
具体的には図2(A)では深度バッファーの深度値が初期値である最背面値に設定される。そして図2(B)ではオブジェクトOBAが描画されている。この場合に図2(B)のJ1に示す領域でのオブジェクトOBAの各ピクセルの深度値は、図2(A)での深度バッファーの深度値よりも前方側(手前側)の深度値となっている。従って、J1に示す領域では、オブジェクトOBAのカラー値が描画バッファーに書き込まれると共に、オブジェクトOBAの深度値が深度バッファーに書き込まれて深度値が更新される。
【0044】
図2(C)ではオブジェクトOBBが描画されている。この場合に図2(C)のJ2に示す領域でのオブジェクトOBBの各ピクセルの深度値は、深度バッファーの深度値よりも後方側(奥側)の深度値となっている。従って、J2に示す領域では、オブジェクトOBBは隠面消去されたと判断され、オブジェクトOBBのカラー値は描画バッファーには書き込まれず、図2(D)のJ3に示すように深度バッファーの深度値も更新されない。
【0045】
一方、J4に示す領域でのオブジェクトOBBの各ピクセルの深度値は、深度バッファーの深度値よりも前方側の深度値となっている。従って、J4に示す領域では、オブジェクトOBBのカラー値が描画バッファーに書き込まれると共に、図2(D)のJ5に示すようにオブジェクトOBBの深度値が深度バッファーに書き込まれて深度値が更新される。そして、図2(D)でオブジェクトOBCが描画されると、上記と同様の手法により、J6の領域ではカラー値の書き込みや深度値の更新が行われず、J7の領域ではカラー値の書き込みと深度値の更新が行われる。
【0046】
以上のような深度バッファー処理を行うことで、描画の順番に依存せずに、奥行き方向での順番が正しく判定され、図1(C)に示すように適切な隠面消去が行われた画像が生成されるようになる。
【0047】
さて、前述した特許文献1の従来技術においても、深度バッファーを利用して衝突判定を行っている。例えば、他のオブジェクトの描画により、深度バッファーの深度値が図3(A)に示すようになっていたとする。この場合に図3(B)のH1に示すように、オブジェクトOBA1では、その深度値がZバッファーの深度値とは異なるため、OBA1は他のオブジェクトと衝突していないと判定される。一方、H2、H3に示すように、オブジェクトOBA2では、その深度値が深度バッファーの深度値と同一になっている。従って、オブジェクトOBA2は、この深度バッファーの深度値を持った他のオブジェクトと衝突していると判定される。
【0048】
しかしながら、この特許文献1の従来技術では図3(C)に示すような問題点がある。図3(C)では、他のオブジェクトOBDの描画により深度バッファーの深度値がH4に示すようになっている。この場合に、H5に示すようにオブジェクトOBA3はオブジェクトOBDと衝突しているのにも関わらず、オブジェクトOBA3の深度値は深度バッファーの深度値と一致していないため、衝突していないと判定されてしまう。またH6に示すように深度値が内挿された場合には、オブジェクトOBA4はオブジェクトOBDと衝突していないのに、衝突していると判定されてしまう。
【0049】
また、他の手法として、仮想的な視点を、地面等を表す平面状のオブジェクトの背面に設定し、背面から見て、表面にあるはずのオブジェクトが描画されれば、そのオブジェクトが平面と衝突していると判定する手法も考えられる。しかしながら、この手法では、単純な平面が仮定されているが、それが平面ではなく複雑な構造を持つオブジェクト(例えば非凸)である場合には、片方の面との衝突が、別の面によって遮蔽される可能性があり、このような場合には衝突を検出できなくなる。
【0050】
2.構成
以上のような問題を解決できる本実施形態の衝突検出システムの構成例を図4に示す。なお本実施形態の衝突検出システムの構成は図4の構成には限定されず、その一部の構成要素(例えば操作部、外部I/F部等)を省略したり、他の構成要素を追加するなどの種々の変形実施が可能である。
【0051】
この衝突検出システムは、処理部10と、描画処理を行う描画部30と、記憶部50(深度バッファー)を含む。また操作部70、外部I/F(インターフェース)部80、情報記憶媒体90を含むことができる。
【0052】
処理部10は、各種の判定処理や制御処理などを行うものであり、例えばCPU等の各種のプロセッサー、専用回路(ASIC)などのハードウェアーや、プロセッサー上で実行されるプログラムなどにより実現できる。処理部10は、オブジェクト空間設定部12、衝突判定部14を含む。
【0053】
オブジェクト空間設定部12は、複数のオブジェクトをオブジェクト空間に配置設定する処理等を行う。具体的には、ワールド座標系でのオブジェクトの位置や回転角度を決定し、その位置にその回転角度でオブジェクトを配置する。ここでオブジェクトは、ロボット等の衝突検出対象物や、周辺構造物や周辺機器などの被衝突検出対象物を、モデル化したものであり、ポリゴンや自由曲面などのプリミティブ面で構成される。
【0054】
衝突判定部14は、衝突検出対象オブジェクトと他のオブジェクト(被衝突検出対象オブジェクト)との間の衝突判定処理を行うものである。衝突判定部14は、マスク画像生成部16、画像比較部18、マスクデータ生成部20を含む。
【0055】
描画部30は、描画処理を行うものであり、例えばGPU等の各種のプロセッサー、専用回路(ASIC)などのハードウェアーや、プロセッサー上で実行されるプログラムなどにより実現できる。描画部30は、深度値判定部32、深度値更新部34、深度値コピー部36を含む。この描画部30での描画処理は、頂点シェーダープログラムにより実現される頂点シェーダーや、ピクセルシェーダープログラムにより実現されるピクセルシェーダーにより実現してもよい。頂点シェーダーでは、頂点の移動処理、座標変換処理、クリッピング処理などが行われる。そして頂点処理後の頂点データに基づいてラスタライズ処理が行われる。またピクセルシェーダーでは、ラスタライズ処理後に、画像を構成するピクセル(フラグメント)単位での処理であるピクセル処理(フラグメント処理)が行われる。即ち、シェーディング言語によって記述されたシェーダープログラムによって、プログラマブルシェーダー処理が実現される。
【0056】
記憶部50は、処理部10や描画部30などのワーク領域となるもので、RAM(SRAM、DRAM等)などのメモリーにより実現できる。この記憶部50は、オブジェクトデータ記憶部52、描画バッファー54、第1、第2の深度バッファー56、58、マスクデータ記憶部60を含む。
【0057】
オブジェクトデータ記憶部52は、オブジェクトの位置データや回転角度データや形状データなどのオブジェクトデータを記憶する。描画バッファー54(カラーバッファー、フレームバッファー)は画像情報(描画データ)を記憶するものであり、具体的には、ピクセル単位でカラー値やα値などの画像情報を記憶する。第1、第2の深度バッファー56、58(Zバッファー)は、深度情報を記憶するものであり、具体的にはピクセル単位で深度値(Z値)を記憶する。これらの描画バッファー54、第1、第2の深度バッファー56、58は、記憶部50を構成するメモリー上に記憶領域として確保される。またマスクデータ記憶部60は、マスクデータ生成部20により生成されたマスクデータを記憶する。
【0058】
操作部70は、使用者が各種の操作情報を入力するためのものである。外部I/F部80は、外部との間で有線や無線で情報の通信処理等を行うものである。情報記憶媒体90は(コンピューターにより読み取り可能な媒体)は、プログラムやデータなどを格納するものであり、その機能は、光ディスク、HDD、或いはメモリーなどにより実現できる。処理部10は、情報記憶媒体90に格納されるプログラム(データ)に基づいて本実施形態の種々の処理を行う。即ち情報記憶媒体90には、本実施形態の各部としてコンピューター(操作部、処理部、記憶部、出力部を備える装置)を機能させるためのプログラム(各部の処理をコンピューターに実行させるためのプログラム)が記憶される。
【0059】
そして本実施形態の衝突検出システムでは、描画部30は、第1の深度バッファー56を参照して、衝突検出対象オブジェクトと、衝突検出対象オブジェクト以外の他のオブジェクトの描画処理を行う。そして処理対象ピクセルの深度値が、第1の深度バッファー56の第1の深度値より所定の視点(描画処理における視点)から見て後方における最前面の深度値である場合に、第2の深度バッファー58の第2の深度値を処理対象ピクセルの深度値に更新する。即ち、処理対象ピクセルが、第1の深度バッファー56の第1の深度値より後方における最前面のプリミティブ面のピクセルである場合に、当該処理対象ピクセルの深度値が、第2の深度バッファー58の対応するピクセル位置に書き込まれる。例えば後述する図7(B)のC1やC2に示すように第2の深度値が更新される。なお、この場合の深度値の判定処理は深度値判定部32が行い、深度値の更新処理は深度値更新部34が行う。また本実施形態では描画部30は、無限遠の視点(広義には所定の視点)での平行投影で描画処理を行う。
【0060】
そして処理部10は、衝突検出対象オブジェクトの描画処理の結果に基づいて、衝突検出対象オブジェクトの、所定の視点から見たときの前面と背面の間に、他のオブジェクトが存在すると判断した場合に、衝突検出対象オブジェクトが他のオブジェクトに衝突したと判定する。
【0061】
例えば後述する図7(B)のC4は衝突検出対象オブジェクトPB2の前面(表面)であり、図8(B)のE4は衝突検出対象オブジェクトPB2の背面(裏面)である。そして図8(A)のD4では、衝突検出対象オブジェクトPB2の前面と背面の間に他のオブジェクトOB3(OB3の面)が存在すると判断されるため、衝突検出対象オブジェクトPB2が他のオブジェクトOB3に衝突したと判定される。
【0062】
更に具体的には本実施形態の衝突検出システムは、描画部30により描画データが書き込まれる描画バッファー54を含む。そして処理部10は、描画バッファー54に書き込まれた描画データに基づいて、衝突検出対象オブジェクトの衝突判定を行う。
【0063】
例えば後述する図12(A)のH1、H2では、衝突検出対象オブジェクトの前面や背面の描画データとして「1」が描画バッファー54に書き込まれる。そして、この描画バッファー54に書き込まれた描画データに基づいて衝突判定が行われる。また図12(C)のI1では、衝突検出対象オブジェクトの前面の描画データとして第1のデータである「1」が描画バッファー54に書き込まれる。またI2では衝突検出対象オブジェクトの背面の描画データとして第2のデータである「−1」が描画バッファー54に書き込まれる。そして、この描画バッファー54に書き込まれた描画データに基づいて衝突判定が行われる。
【0064】
更に具体的には描画部30は、処理対象ピクセルの深度値が、第1の深度バッファー56の第1の深度値より、所定の視点から見て後方における最前面の深度値であり、且つ、衝突検出対象オブジェクトの深度値である場合には、第2の深度バッファー58の第2の深度値を処理対象ピクセルの深度値に更新して、描画バッファー54に描画データを書き込む。例えば図7(B)のC4は衝突検出対象オブジェクトPB2の前面であるため、「1」の描画データが書き込まれる。同様に図8(B)のE4は衝突検出対象オブジェクトPB2の背面であるため、「1」の描画データが書き込まれる。
【0065】
一方、描画部30は、処理対象ピクセルの深度値が、第1の深度バッファー56の第1の深度値より、所定の視点から見て後方における最前面の深度値であり、且つ、衝突検出対象オブジェクト以外の他のオブジェクトの深度値である場合には、描画バッファー54に描画データを書き込むことなく、第2の深度バッファー58の第2の深度値を処理対象ピクセルの深度値に更新する。例えば図8(A)のD4は他のオブジェクトOB3の背面であるため、描画バッファー54に「1」の描画データは書き込まれず、描画バッファー54には初期値である「0」が書き込まれたままになる。
【0066】
そして処理部10は、第1の描画処理において衝突検出対象オブジェクトの前面が描画され、第1の描画処理の次の第2の描画処理において衝突検出対象オブジェクトの背面が描画されなかったことが、描画バッファー54の描画データに基づき検出された場合に、衝突検出対象オブジェクトが他のオブジェクトに衝突したと判定する。
【0067】
例えば後述する図10(C)のG1では、第1の描画処理において衝突検出対象オブジェクトPBの前面が描画されている。一方、図10(D)のG2では、第2の描画処理において衝突検出対象オブジェクトPBの背面が描画されておらず、他のオブジェクトOBの背面が描画されている。このような場合、衝突検出対象オブジェクトPBの描画時の描画データを「1」とすると、図10(C)の第1の描画処理では、図12(B)のH3に示すように「1」の描画データが描画バッファー54が書き込まれる。一方、図10(D)の第2の描画処理では、図12(B)のH4に示すように「1」の描画データは書き込まれず、描画データは初期値である「0」のままになる。従って、この場合には、他のオブジェクトとの衝突が発生したと判定する。
【0068】
また本実施形態では、後述する図11(A)、図11(B)で説明するように、第1の描画処理において衝突検出対象オブジェクトの前面が描画された場合に第1の論理レベル(例えば「1」)になるマスクデータが生成される。ここで第1の論理レベルは、例えば二値化されたデジタルデータの一方の論理レベルである。またマスクデータは、例えば衝突検出対象オブジェクトの前面が描画された直後であることを示すデータである。
【0069】
そして処理部10は、図10(A)、図10(C)の第1の描画処理で生成されたマスクデータが第1の論理レベル「1」であり、図10(B)、図10(D)の第2の描画処理において衝突検出対象オブジェクトの背面が描画されなかったことが描画バッファー54の描画データに基づき検出された場合に、衝突検出対象オブジェクトが他のオブジェクトに衝突したと判定する。例えば図11(B)や図12(B)のH3、H4に示すように、マスクデータが「1」であり、描画データが「0」である場合には、衝突が発生したと判定する。なおマスクデータはマスクデータ生成部20が生成する。また後述するマスク画像はマスク画像生成部16が生成し、マスクデータやマスク画像を用いた画像の比較処理は、画像比較部18が行う。
【0070】
また描画部30は、衝突検出対象オブジェクトの前面を描画する場合には、描画データとして第1のデータを描画バッファー54に書き込み、衝突検出対象オブジェクトの背面を描画する場合には、描画データとして第1のデータとは異なる第2のデータを描画バッファー54に書き込んでもよい。例えば図12(C)のI1では、衝突検出対象オブジェクトの前面が描画されたため、第1のデータである「1」が描画バッファー54に書き込まれる。一方、図12(C)のI2では、衝突検出対象オブジェクトの背面が描画されたため、第2のデータである「−1」が描画バッファー54に書き込まれる。
【0071】
そして処理部10は、第1の描画処理において第1のデータが描画バッファー54に書き込まれ、第1の描画処理の次の第2の描画処理において、第2のデータが描画バッファー54に書き込まれなかった場合に、衝突検出対象オブジェクトについての衝突が発生したと判定する。例えば図12(D)のI3では、衝突検出対象オブジェクトの前面が描画されているため、第1のデータである「1」の描画データが描画バッファー54に書き込まれている。一方、I4では、第2のデータである「−1」の描画データは書き込まれていない。
【0072】
即ち図12(C)のI1、I2では、衝突検出対象オブジェクトの前面に対応する第1のデータ「1」と、背面に対応する第2のデータ「−1」が連続して書き込まれているため、衝突が発生していないと判定する。これに対して図12(D)のI3、I4では、前面に対応する第1のデータ「1」の次に同じ第1のデータ「1」が描画されているため、衝突が発生したと判定する。具体的には、この場合には例えば自己衝突が発生したと判定される。
【0073】
なお処理部10は、衝突検出対象オブジェクトの描画処理の結果に基づいて、衝突検出対象オブジェクトの前面の次に衝突検出対象オブジェクトの背面が描画されたと判断した場合に、衝突検出対象オブジェクトが他のオブジェクトに衝突しなかったと判定する。例えば図7(A)のB2では衝突検出対象オブジェクトPB1の前面が描画され、次の図7(B)のC2では衝突検出対象オブジェクトPB1の背面が描画されている。従って、この場合には衝突検出対象オブジェクトが他のオブジェクトに衝突しなかったと判定される。
【0074】
なお、1画面分の描画処理が終了した後に、第2の深度バッファー58の第2の深度値は、第1の深度バッファー56に書き込まれる(コピーされる)。この深度値の書き込み(コピー)は深度値コピー部36が行う。例えば第1の深度バッファー56に、第2の深度バッファー58の第2の深度値がコピーされて上書きされる。これにより、前回の描画処理で更新された第2の深度バッファー58の第2の深度値を、第1の深度バッファー56に書き込んで(コピーして)、次回の描画処理を行うことが可能になる。
【0075】
なお、衝突検出対象オブジェクトは、他のオブジェクトとの衝突検出対象となるオブジェクトであり、例えばロボットをモデル化したオブジェクトなどである。また、プリミティブ面がポリゴンである場合を例にとると、三角形を構成する3頂点が、視点から見て例えば反時計回りに見える面が表面(front surface, front-facing surface)になり、視点から見て例えば時計回りに見える面が裏面(back surface, back-facing surface)になる。閉じたオブジェクトの表面が外を向いていることを前提にすると、表面を前面、裏面を背面と記述することができる。
【0076】
以上のように本実施形態では、第1、第2の深度バッファー56、58が設けられ、これらの第1、第2の深度バッファー56、58を用いて衝突対象オブジェクト及び他のオブジェクトの描画処理が行われる。そして、描画処理の結果に基づいて、衝突検出対象オブジェクトの前面と背面の間に他のオブジェクトが存在すると判断されると、衝突が発生したと判断される。即ち、本実施形態の手法は、全てのオブジェクト(物体)の表面の深度値を、前面から順に描画して行けば、オブジェクトに衝突が発生していなければ、オブジェクトの前面を描画した後に、必ずオブジェクトの背面が描画されるという原理に基づいている。即ちオブジェクトの前面と背面の間に、別の面が描画されれば、それは衝突が発生したことを意味する。
【0077】
例えば衝突検出対象オブジェクトを描画するときには、例えば「1」の描画データを描画し、そうでない場合にはなにも描画しない、つまり0であるとする。すると処理対象ピクセルについて、図12(A)のH1、H2に示すように、「1」の描画データが連続していた場合には、衝突は発生していないと判定できる。一方、図12(B)のH3、H4に示すように、「1」の後に「0」が来る場合には、衝突が発生していると判定できる。
【0078】
また衝突検出対象オブジェクトの前面を、例えば第1のデータである「1」の描画データで描画し、背面を、例えば第2のデータである「−1」で描画したとする。すると図12(C)のI1、I2に示すように「1」の後に「−1」が来た場合には、衝突が発生していないと判定できる。一方、図12(D)のI3、I4に示すように、「1」の後に「−1」が来ない場合には、衝突が発生したと判定できる。
【0079】
以上のように本実施形態によれば、深度バッファー処理を有効活用した高速(正確)な衝突判定(近接判定)を実現できる。即ち、衝突(近接)の問題を、最新の描画ハードウェアー処理に適した遮蔽処理に置き換えることで、非常に高速に、衝突判定(近接判定)を行うことが可能になる。
【0080】
なお本実施形態のオブジェクトの描画処理では、描画部30は無限遠の視点での平行投影で描画処理を行っている。
【0081】
即ち、通常の3DCGにおいては、パースのついた画像を生成するために透視投影で描画処理を行うのが一般的である。この点、本実施形態では、3DCGの画像生成のためではなく、衝突判定のために深度バッファー処理を利用している。そして透視投影で描画処理を行うと、正確な衝突判定を実現できなくなるおそれがあり、本実施形態では、この点に着目して平行投影で描画処理を行っている。
【0082】
図5に本実施形態の衝突検出システムを含むロボットシステムの例を示す。このロボットシステムは、制御装置300(情報処理装置)とロボット310とを含む。制御装置300はロボット310の制御処理を行う。具体的には、動作シーケンス情報(シナリオ情報)に基づいてロボット310を動作させる制御を行う。ロボット310は、アーム320及びハンド(把持部)330を有する。そして制御装置300からの動作指示にしたがって動作する。例えば、図示しないパレットに載せられたワークを把持したり、移動するなどの動作を行う。また、図示しない撮像装置で取得された撮像画像情報に基づいて、ロボットの姿勢やワークの位置などの情報が検出され、検出された情報が制御装置300に送られる。
【0083】
本実施形態の衝突検出システムは例えば図5の制御装置300に設けられ、例えば制御装置300のハードウェアーやプログラムにより衝突検出システムが実現される。そして、ラインタイムの使用では、周辺環境などが動的に変化する場合に、ロボット310の実際の動作に先行して、本実施形態の衝突検出システムがシミュレーションにより衝突の判定処理を行う。そして制御装置300は、ロボット310が周辺構造物や周辺機器などに衝突しないように、判定処理の結果に基づいてロボット310の制御を行う。一方、オフラインの使用では、本実施形態の衝突検出システムにより、動作シーケンス情報等の作成時にシミュレーションにより衝突を検証する。そして制御装置300は、衝突が起こらないように作成された動作シーケンス情報(シナリオ情報)に基づいて、ロボット310を制御する。
【0084】
3.本実施形態の手法
次に本実施形態の手法について図面を用いて更に詳細に説明する。
【0085】
自己衝突を考慮しなくてもよい場合には、本実施形態では以下の手法により衝突を検出する。即ち本実施形態では第1の深度バッファー56の第1の深度値と第2の深度バッファー58の第2の深度値を用いる。具体的には、第1の深度値よりも後方(奥側)で、且つ最前面(第2の深度値)のオブジェクトを描画対象とする。この時、衝突検出対象オブジェクトについては、実際に描画を行い、且つ深度値を更新する。一方、衝突検出対象オブジェクト以外のオブジェクトについては、深度値のみを更新し、描画は行わない。
【0086】
そして1画面分の描画が行われるごとに、第2の深度バッファー58の第2の深度値を第1の深度バッファー56の第1の深度値へコピーし、深度値の全てが最背面に到達するまで描画を行う。或いは、全ての衝突検出対象オブジェクトの背面を描画し終えるまで描画を行う。つまり前方の面から、1面ずつ描画を行うということである。そして、衝突検出対象オブジェクトがなにかと衝突していなければ、その前面を描画した次のステップで、必ずその背面が描画される。一方、衝突検出対象オブジェクトがなにかと衝突していれば、衝突検出対象オブジェクトの前面と背面の間に、別のオブジェクトが介在することを意味する。
【0087】
更に具体的には本実施形態では、1画面分の描画が行われた後、以下の処理が行われる。まずマスクデータ記憶部60に記憶されるマスクデータと描画データとの論理積がとられて、マスク画像が生成される。そして、生成されたマスク画像とマスクデータが比較され、それらが一致していれば、その時点では衝突は検出されないと判断する。一方、一致していなければ、衝突が検出されたと判断する。
【0088】
衝突が検出されない場合、以下の処理が行われる。まず、第2の深度値を、新規の第1の深度値としてコピーする。そしてマスクデータと描画データの排他的論理和がとられ、得られたデータと描画データとの論理積がとられ、得られたデータを新規のマスクデータとしてマスクデータ記憶部60に記憶する。
【0089】
以上の処理を、第1の深度値の全てが最背面に到達するまで行う。そして衝突が検出されずに最背面に到達すれば、衝突は発生しなかったと判断する。
【0090】
次に図6(A)〜図12(D)を用いて本実施形態の衝突検出手法について更に詳細に説明する。
【0091】
例えば図6(A)、図6(B)において、PB1、PB2、PB3は、衝突検出対象オブジェクトであり、OB1、OB2、OB3は、衝突検出対象オブジェクト以外の他のオブジェクト(被衝突検出対象オブジェクト)である。ロボットシステムに用いられる衝突検出システムを例にとれば、PB1、PB2、PB3は、現実世界のロボットをモデル化したロボットオブジェクト、或いはロボットオブジェクトを構成するパーツオブジェクトである。またOB1、OB2、OB3は、周辺構造物や周辺機器をモデル化したオブジェクト、或いはそのパーツオブジェクトである。なおパーツオブジェクトは、衝突検出対象オブジェクトなどのモデルオブジェクトを構成する部分となるオブジェクトである。例えば衝突検出対象オブジェクトなどのモデルオブジェクトは、複数のパーツオブジェクトと、パーツオブジェクト間を接続する関節部分などにより構成される。
【0092】
図6(B)において、DP1は、第1の深度バッファー56に設定される第1の深度値(第1の深度分布)であり、DP2は、第2の深度バッファー58に設定される第2の深度値(第2の深度分布)である。図6(B)に示すように初期状態では、第1の深度バッファー56の第1の深度値DP1は最前面値に設定され、第2の深度バッファー58の第2の深度値DP2は最背面値に設定される。そして図6(B)では、衝突検出対象であるオブジェクトPB1は、他のオブジェクトであるOB1、OB2、OB3と衝突していないが、衝突検出対象であるオブジェクトPB2、PB3は、他のオブジェクトであるOB3と衝突している。
【0093】
図6(B)においてオブジェクトPB1〜PB3、OB1〜OB3の描画処理を行う。そして処理対象ピクセルの深度値が、第1の深度バッファー56の第1の深度値DP1よりも後方(奥側)の最前面の深度値である場合に、第2の深度バッファー58の第2の深度値DP2が、処理対象ピクセルの深度値に置き換えられて更新される。
【0094】
例えば図6(B)のA1、A2、A3、A4、A5は、第1の深度値DP1よりも後方における最前面になる。従って、この場合には、図7(A)のB1、B2、B3、B4、B5に示すように第2の深度値DP2が更新される。即ち第2の深度値DP2は、図7(A)のB1では、オブジェクトOB1の前面の深度値に更新され、B2では、オブジェクトPB1の前面の深度値に更新される。また第2の深度値DP2は、B3では、オブジェクトOB2の前面の深度値に更新され、B4では、オブジェクトOB3の前面の深度値に更新され、B5では、オブジェクトPB3の前面の深度値に更新される。
【0095】
そして図7(A)のB2、B5の処理対象ピクセルは、衝突検出対象のオブジェクトPB1、PB3に属している。従って、後述する図12(A)に示すように、B2、B5の処理対象ピクセルについては、「1」の描画データが描画バッファー54に書き込まれることになる。一方、図7(A)のB1、B3、B4の処理対象ピクセルは、衝突検出対象以外の他のオブジェクトOB1、OB2、OB3に属している。従って、B1、B3、B4の処理対象ピクセルでは、「1」の描画データは書き込まれず、描画データは「0」のままとなる。なお描画バッファー54の描画データは、初期状態において「0」にクリアされている。
【0096】
次に、1画面分の描画処理が終了すると、図7(B)に示すように、図7(A)で更新された第2の深度値DP2が、第1の深度バッファー56の第1の深度値DP1にコピーされる。そして、上述と同様の描画処理及び深度値の更新処理が行われる。
【0097】
例えば図7(B)のC1、C2、C3、C4、C5は、第1の深度値DP1よりも後方の最前面になる。従って、同図に示すように第2の深度値DP2が更新される。
【0098】
この場合に図7(B)のC2、C4の処理対象ピクセルは、衝突検出対象のオブジェクトPB1、PB2に属しているため、「1」の描画データが描画バッファー54に書き込まれることになる。一方、C1、C3、C5の処理対象ピクセルは、他のオブジェクトOB1、OB2、OB3に属しているため、「1」の描画データは書き込まれないことになる。
【0099】
以上のようにして、図8(A)ではD1、D2、D3、D4、D5に示すように第2の深度値DP2の更新が行われ、描画バッファー54への描画データの書き込みが行われる。また図8(B)ではE1、E2、E3、E4、E5に示すように第2の深度値DP2の更新が行われ、描画バッファー54への描画データの書き込みが行われる。図9(A)、図9(B)も同様である。また図8(A)のD1では、第2の深度値DP2は最背面に到達したため、この処理対象ピクセルについての第2の深度値DP2の更新は終了することになる。
【0100】
そして本実施形態では図10(A)〜図10(D)に示す原理により、衝突検出対象オブジェクトの衝突判定を行っている。
【0101】
例えば図10(A)のF1では、第1の描画処理において、衝突検出対象オブジェクトPBの前面が描画されている。そして図10(B)のF2では、第1の描画処理による1画面分の描画が行われた後の次の第2の描画処理において、衝突検出対象オブジェクトPBの背面が描画されている。このように、衝突検出対象オブジェクトPBの前面と背面が連続して描画された場合には、衝突検出対象オブジェクトPBは他のオブジェクトOBと衝突していないと判定される。
【0102】
一方、図10(C)のG1では、第1の描画処理において、衝突検出対象オブジェクトPBの前面が描画されている。そして図10(D)のG2では、第1の描画処理の次の第2の描画処理において、衝突検出対象オブジェクトPBの背面ではなく、他のオブジェクトOBの背面が描画されている。従って、この場合には衝突検出対象オブジェクトPBの前面と背面の間に他のオブジェクトOBの面が存在するため、衝突検出対象オブジェクトPBが他のオブジェクトOBと衝突したと判定される。
【0103】
例えば図7(A)のB2では、衝突検出対象オブジェクトPB1の前面が描画され、次の描画処理である図7(B)のC2では、衝突検出対象オブジェクトPB1の背面が描画されている。従って、この場合には衝突検出対象オブジェクトPB1の前面の直後に背面が描画されているため、衝突が発生していないと判定される。
【0104】
一方、図7(B)のC4では、衝突検出対象オブジェクトPB2の前面が描画されているが、次の描画処理である図8(A)のD4では、衝突検出対象オブジェクトPB2の背面ではなく、他のオブジェクトOB3の背面が描画されている。従って、この場合には、衝突検出対象オブジェクトPB2が他のオブジェクトOB3と衝突したと判定される。
【0105】
同様に図8(A)のD3と図8(B)のE3では、衝突検出対象オブジェクトPB1についての衝突は発生していないと判定される。一方、図8(A)のD5と図8(B)のE5では、衝突検出対象オブジェクトPB3と他のオブジェクトOB3の衝突が発生したと判定される。
【0106】
以上のように本実施形態によれば、深度バッファーの深度値を用いた効率的な衝突判定を実現できる。従って、最新の並列化ハードウェアーにより、高速に衝突を検出することが可能になる。
【0107】
次に、マスクデータを用いた衝突判定について詳細に説明する。図11(A)に、マスクデータを用いた衝突判定を実現する構成の機能ブロック図を示し、図11(B)にマスクデータ等についての真理値表を示す。ここで、マスクデータは、衝突検出対象オブジェクトの前面が検出された直後かどうかを示すデータである。また描画データは、衝突検出対象オブジェクトのピクセル(面)の描画時に「1」(第1の論理レベル)になるデータである。
【0108】
図11(A)に示すように、論理積部110により、マスクデータと描画データの論理積(AND)がとられ、マスク画像が生成される。そして、排他的論理和部114により、論理積部110からのマスク画像と、マスクデータとの排他的論理和(XOR)がとられる。そして図11(B)の真理値表から明らかなように、マスクデータと描画データの論理積であるマスク画像と、マスクデータが不一致である場合には、排他的論理和部114の出力が「1」になり、衝突が検出されたと判定される。一方、マスク画像とマスクデータが一致した場合には、排他的論理和部114の出力が「0」になり、衝突なしと判定される。
【0109】
また、排他的論理和部112により、マスクデータと描画データの排他的論理和がとられ、論理積部116により、得られたデータと描画データの論理積がとられる。これにより、論理積部116からは、次の描画処理(1画面分の描画処理)で使用されるマスクデータが出力され、図4のマスクデータ記憶部60に記憶される。
【0110】
例えば図11(B)において、マスクデータ=1、描画データ=1の場合には、図10(A)、図10(B)に示すように衝突検出対象オブジェクトの前面と背面が連続したと判断できる。従って、衝突検出=0(衝突なし)になり、次のマスクデータ=0になる。
【0111】
またマスクデータ=1、描画データ=0の場合には、衝突検出対象オブジェクトの前面の後が、背面ではなかったと判断できる。従って、衝突検出=1(衝突あり)になり、次のマスクデータ=0になる。
【0112】
またマスクデータ=0、描画データ=1の場合には、衝突検出対象オブジェクトの前面が現れたと判断できる。従って、衝突検出=0になり、前面が検出された直後かどうかを示す次のマスクデータは1になる。またマスクデータ=0、描画データ=0の場合には、上記以外と判断できるため、衝突検出=0、次のマスクデータ=0になる。
【0113】
以上のように本実施形態では、第1の描画処理(図10(A)、図10(C))で生成されたマスクデータが「1」(第1の論理レベル)であり、第2の描画処理(図10(B)、図10(D))において衝突検出対象オブジェクトの背面が描画されなかったことが描画バッファー54の描画データに基づき検出された場合に、衝突検出対象オブジェクトが他のオブジェクトに衝突したと判定している。
【0114】
図12(A)、図12(B)は、マスクデータや描画データを用いた衝突判定を説明する図である。図12(A)のH1では、衝突検出対象オブジェクトの前面が描画され、描画データが1になるため、次のマスクデータも1になる。そしてH2では衝突検出対象オブジェクトの背面が描画されて描画データが1になり、マスクデータも1であるため、図11(B)の真理値表に示すように、衝突が検出されなかった(衝突検出=0)と判定される。
【0115】
図12(B)のH3では、衝突検出対象オブジェクトの前面が描画され、描画データが1になるため、次のマスクデータも1になる。そしてH4では衝突検出対象オブジェクトの背面は描画されず、描画データが0で、マスクデータが1であるため、図11(B)の真理値表に示すように、衝突が検出された(衝突検出=1)と判定される。
【0116】
さて、以上では、衝突検出対象オブジェクトの自己衝突を考慮しない場合について説明したが、自己衝突を考慮する場合には、衝突検出対象オブジェクトの前面と背面において、異なる値の描画データを描画すればよい。例えば衝突検出対象オブジェクトの前面を描画する場合には、描画データとして第1のデータを描画バッファー54に書き込む。一方、衝突検出対象オブジェクトの背面を描画する場合には、描画データとして第1のデータとは異なる第2のデータを描画バッファー54に書き込む。そして第1の描画処理において第1のデータが描画バッファー54に書き込まれ、次の第2の描画処理において、第2のデータが描画バッファー54に書き込まれていない場合に、衝突が発生したと判定する。
【0117】
図12(C)、図12(D)は、描画データの第1のデータが「1」であり、第2のデータが「−1」である場合の例である。図12(C)のI1では、衝突検出対象オブジェクトの前面が描画されたため、描画データは第1のデータ(=1)になり、I2では、衝突検出対象オブジェクトの背面が描画されたため、描画データは第2のデータ(=−1)となっている。従って、第1の描画処理において、前面に対応する第1のデータ(=1)が書き込まれ、第2の描画処理において、背面に対応する第2のデータ(=−1)が書き込まれているため、衝突は発生していないと判定される。
【0118】
一方、図12(D)のI3では、衝突検出対象オブジェクトの前面が描画されたため、描画データは第1のデータ(=1)になる。一方、I4でも、衝突検出対象オブジェクトの前面が描画されたため、描画データは第1のデータ(=1)となっている。従って、第1の描画処理においては、前面に対応する第1のデータ(=1)が書き込まれているが、第2の描画処理においては、背面に対応する第2のデータ(=−1)が書き込まれていないため、衝突が発生したと判定される。具体的には、図12(D)のI3とI4では前面が連続しているため、自己衝突が発生したと判定される。
【0119】
以上のようにすることで、衝突検出対象オブジェクトと他のオブジェクトの間のみならず、衝突検出対象オブジェクトの自己衝突についても検出できるようになる。なお、以上では前面を描画する場合に第1のデータ(=1)を書き込み、背面を描画する場合には第2のデータ(=−1)を書き込む場合について説明したが、本実施形態の手法はこれに限定されるものではない。例えば前面を描画する際の色と、背面を描画する際の色を異ならせ、描画色の比較処理を行うことで、自己衝突等を判定することも可能である。
【0120】
4.詳細な処理
次に本実施形態の詳細な処理例について図13、図14のフローチャートを用いて説明する。
【0121】
まず、図6(B)で説明したように、第1の深度バッファー56の深度値(DP1)を最前面値に設定し、第2の深度バッファー58の深度値(DP2)を最背面値に設定する(ステップS1、S2)。
【0122】
次に、第1の深度バッファー56の全面が最背面に到達したか否かを判断し、到達した場合には、衝突なしとして処理を終了する(ステップS3、S4)。一方、到達していないと判断された場合には、描画バッファー54をゼロクリアする(ステップS5)。即ち描画データ=0に初期化する。なおステップS3の終了条件は、全ての衝突検出対象オブジェクトの背面の描画処理が終了したかという条件であってもよい。
【0123】
次に、全ての処理対象ピクセルを処理したか否かを判断する(ステップS6)。そして全ての処理対象ピクセルの処理を終了していない場合には、未処理の処理対象ピクセルを1つ選択する(ステップS7)。
【0124】
次に、選択された処理対象ピクセルの深度値が、第1の深度バッファー56の深度値より後方における最前面か否かを判定する(ステップS8)。そして、後方の最前面ではない場合にはステップS6に戻り、後方の最前面である場合には、処理対象ピクセルの深度値が、第2の深度バッファー58の深度値より前方か否かを判断する(ステップS9)。そして前方ではない場合にはステップS6に戻り、前方である場合には、第2の深度バッファー58の深度値を、処理対象ピクセルの深度値に更新する(ステップS10)。即ち図7(A)〜図9(B)で説明したような第2の深度バッファー58の深度値DP2の更新処理を行う。
【0125】
そして、処理対象ピクセルが衝突検出対象オブジェクトならば、対応する描画バッファー54のピクセル位置に描画データ=1を描画する(ステップS11)。これにより図12(A)、図12(B)で説明したような衝突判定を実現できるようになる。
【0126】
図13のステップS6で、全ての処理対象ピクセルの処理(1画面分の描画処理)を終了したと判断した場合には、衝突判定処理を行う(ステップS12)。そして衝突が検出されか否かを判断し(ステップS13)、検出された場合には、衝突ありとして処理を終了する(ステップS14)。一方、検出されなかった場合には、第2の深度バッファー58の深度値を、第1の深度バッファー56にコピーする(ステップS15)。そして例えばステップS2に戻る。
【0127】
図14は図13のステップS12の衝突判定処理の詳細を示すフローチャートである。
【0128】
まず1回目の描画処理か否かを判断する(ステップS21)。そして1回目の描画処理(例えば図7(A)の描画処理)である場合には、得られた画像をマスクデータとしてマスクデータ記憶部60に記憶する(ステップS22)。
【0129】
1回目の描画処理でない場合には、図11(A)、図11(B)で説明したように、マスクデータと描画データの論理積をとり、マスク画像を生成する(ステップS23)。
【0130】
次にマスクデータとマスク画像が一致しているか否かを判断し(ステップS24)、一致していない場合には、衝突ありとして、衝突判定処理を終了する(ステップS25)。一方、一致した場合には、マスクデータと描画データの排他的論理和をとり、得られたデータと描画データとの論理積をとり、得られたデータを次のマスクデータとして、マスクデータ記憶部60に記憶する(ステップS26)。そして、衝突なしとして、衝突判定を終了する(ステップS27)。
【0131】
なお、上記のように本実施形態について詳細に説明したが、本発明の新規事項および効果から実体的に逸脱しない多くの変形が可能であることは当業者には容易に理解できるであろう。従って、このような変形例はすべて本発明の範囲に含まれるものとする。例えば、明細書又は図面において、少なくとも一度、より広義または同義な異なる用語と共に記載された用語は、明細書又は図面のいかなる箇所においても、その異なる用語に置き換えることができる。また本実施形態及び変形例の全ての組み合わせも、本発明の範囲に含まれる。また衝突検出システム、ロボットシステムの構成・動作や、深度値の更新手法、オブジェクトの描画手法、描画データの設定手法、衝突判定手法等も、本実施形態で説明したものに限定されず、種々の変形実施が可能である。
【符号の説明】
【0132】
OBA〜OBC、OBA1〜OBA4、オブジェクト、
PB、PB1〜PB3 衝突検出対象オブジェクト、
OB、OB1〜OB3 他のオブジェクト、
DP1 第1の深度値、DP2 第2の深度値、
10 処理部、12 オブジェクト空間設定部、14 衝突判定部、
16 マスク画像生成部、18 画像比較部、20 マスクデータ生成部、
30 描画部、32 深度値判定部、34 深度値更新部、36 深度値コピー部、
50 記憶部、52 オブジェクトデータ記憶部、54 描画バッファー、
56 第1の深度バッファー、58 第2の深度バッファー、70 操作部、
80 外部I/F部、90 情報記憶媒体、110 論理積部、
112 排他的論理和部、114 排他的論理和部、116 論理積部、
300 制御装置、310 ロボット、320 アーム、330 ハンド
【技術分野】
【0001】
本発明は、衝突検出システム、ロボットシステム、衝突検出方法及びプログラム等に関する。
【背景技術】
【0002】
物体間の衝突や近接の有無を判定することは多くの分野で必要とされている。例えばロボットなどの分野において、衝突の発生は非常に大きな問題となる。このため、従来より、実際に衝突が発生する以前に、衝突の有無や、許容された以上の近接を、コンピューターによる計算により判定する手法が研究、開発されている。このような衝突判定手法の従来技術としては、例えば特許文献1、2等に開示される技術が知られている。
【0003】
特許文献1の手法は、その図6のフローチャートに示されている。この従来技術では、物体(オブジェクト)の3次元の配置を、横(X)と縦(Y)の2次元位置と、その位置に対応する深度値(Z値)として記憶する装置において、プリミティブを逐次的にレンダリングする。そして、そのレンダリングの過程で同一深度値を持つもの、つまり3次元空間的に同じ位置を占めるものが現れれば、それを衝突と判定する。
【0004】
特許文献2の手法は、その図2、図3により説明されている。この従来技術では、ポリゴンの原点から、そのポリゴンのある方向の面までの距離を予め計算し、キューブマップとして保存する。そして、原点から衝突検出の対象となる物体との距離と、キューブマップに記憶された距離との大小により、衝突を判定する。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開平9−204543号公報
【特許文献2】特表2009−545075号公報
【発明の概要】
【発明が解決しようとする課題】
【0006】
しかしながら特許文献1の従来技術では、深度値の更新が、物体を描画する順番に依存するため、衝突の検出漏れが発生する可能性がある。例えば、前方側(手前側)に配置された物体を描画した後で、その後方側(奥側)において別の物体間で衝突が起こったとしても、深度値は既に前方側のオブジェクトの値に更新されているために、それを検出することはできないことになる。
【0007】
また特許文献2の従来技術では、非凸であるポリゴンの衝突を正確に取り扱うのが困難であるという問題がある。即ち、原点から面までの距離を単一のキューブマップに記憶しているため、ある方向において、そのポリゴンの面が複数ある場合、つまりそのような非凸のポリゴンの場合においては、それを単一のキューブマップとしては表現できないことになる。
【0008】
本発明の幾つかの態様によれば、衝突検出対象オブジェクトの正確な衝突判定を実現できる衝突検出システム、ロボットシステム、衝突検出方法及びプログラム等を提供できる。
【課題を解決するための手段】
【0009】
本発明の一態様は、処理部と、描画処理を行う描画部と、深度情報を記憶する第1の深度バッファーと、深度情報を記憶する第2の深度バッファーとを含み、前記描画部は、前記第1の深度バッファーを参照して、衝突検出対象オブジェクトと、衝突検出対象オブジェクト以外の他のオブジェクトの描画処理を行い、処理対象ピクセルの深度値が、前記第1の深度バッファーの第1の深度値より所定の視点から見て後方における最前面の深度値である場合に、前記第2の深度バッファーの第2の深度値を前記処理対象ピクセルの深度値に更新し、前記処理部は、前記衝突検出対象オブジェクトの描画処理の結果に基づいて、前記衝突検出対象オブジェクトの前記所定の視点から見たときの前面と背面の間に、前記他のオブジェクトが存在すると前記処理部が判断した場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突したと判定する衝突検出システムに関係する。
【0010】
本発明の一態様によれば、第1の深度バッファーを参照して、衝突検出対象オブジェクトと他のオブジェクトの描画処理が行われる。そして描画処理の処理対象ピクセルの深度値が、第1の深度バッファーの第1の深度値よりも後方における最前面の深度値である場合に、第2の深度値が、処理対象ピクセルの深度値に更新される。そしてこの描画処理の結果に基づいて、衝突検出対象オブジェクトの前面と背面の間に他のオブジェクトが存在すると判断されると、衝突が発生したと判定される。このようにすれば、深度バッファー処理を有効活用した衝突判定が可能になり、衝突検出対象オブジェクトの正確な衝突判定を実現できるようになる。
【0011】
また本発明の一態様では、前記描画部により描画データが書き込まれる描画バッファーを含み、前記処理部は、前記描画バッファーに書き込まれた前記描画データに基づいて、前記衝突検出対象オブジェクトの衝突判定を行ってもよい。
【0012】
このようにすれば、描画処理の結果として、描画データが描画バッファーに書き込まれ、書き込まれた描画データに基づいて、衝突検出対象オブジェクトの衝突判定を行うことが可能になる。
【0013】
また本発明の一態様では、前記描画部は、前記処理対象ピクセルの深度値が、前記第1の深度バッファーの第1の深度値より前記所定の視点から見て後方における最前面の深度値であり、且つ、前記衝突検出対象オブジェクトの深度値である場合には、前記第2の深度バッファーの第2の深度値を前記処理対象ピクセルの深度値に更新して、前記描画バッファーに前記描画データを書き込み、前記処理対象ピクセルの深度値が、前記第1の深度バッファーの第1の深度値より前記所定の視点から見て後方における最前面の深度値であり、且つ、前記衝突検出対象オブジェクト以外の前記他のオブジェクトの深度値である場合には、前記描画バッファーに前記描画データを書き込むことなく、前記第2の深度バッファーの第2の深度値を前記処理対象ピクセルの深度値に更新してもよい。
【0014】
このようにすれば、衝突検出対象オブジェクトについては、深度値の更新と描画データの書き込みが行われる一方で、他のオブジェクトについては、描画データの書き込みが行われず、深度値の更新だけが行われるようになる。このような描画データの書き込みを行うことで、衝突検出対象オブジェクトの前面と背面の間に他のオブジェクトが存在するか否かを判定できるようになる。
【0015】
また本発明の一態様では、前記処理部は、第1の描画処理において前記衝突検出対象オブジェクトの前面が描画され、前記第1の描画処理の次の第2の描画処理において前記衝突検出対象オブジェクトの背面が描画されなかったことが、前記描画バッファーの前記描画データに基づき検出された場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突したと判定してもよい。
【0016】
このようにすれば、第1の描画処理で衝突検出対象オブジェクトの前面が描画され、次の第2の描画処理で衝突検出対象オブジェクトの背面が描画されたことを、描画バッファーの描画データに基づき判断できるようになる。
【0017】
また本発明の一態様では、前記第1の描画処理において前記衝突検出対象オブジェクトの前面が描画された場合に第1の論理レベルになるマスクデータが生成され、前記処理部は、前記第1の描画処理で生成された前記マスクデータが前記第1の論理レベルであり、前記第2の描画処理において前記衝突検出対象オブジェクトの背面が描画されなかったことが前記描画バッファーの前記描画データに基づき検出された場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突したと判定してもよい。
【0018】
このようにすれば、生成されたマスクデータが第1の論理レベルか否かを判断することで、第1の描画処理において衝突検出対象オブジェクトの前面が描画されたか否かを判断できるようになる。そして、マスクデータが第1の論理レベルであり、且つ第2の描画処理で衝突検出対象オブジェクトの背面が描画された場合に、衝突検出対象オブジェクトの衝突が発生したと判定できるようになる。
【0019】
また本発明の一態様では、前記描画部は、前記衝突検出対象オブジェクトの前面を描画する場合には、前記描画データとして第1のデータを前記描画バッファーに書き込み、前記衝突検出対象オブジェクトの背面を描画する場合には、前記描画データとして前記第1のデータとは異なる第2のデータを前記描画バッファーに書き込み、前記処理部は、第1の描画処理において前記第1のデータが前記描画バッファーに書き込まれ、前記第1の描画処理の次の第2の描画処理において、前記第2のデータが前記描画バッファーに書き込まれなかった場合に、前記衝突検出対象オブジェクトについての衝突が発生したと判定してもよい。
【0020】
このようにすれば、例えば第1の描画処理において描画データとして第1のデータが描画され、第2の描画処理において描画データとして第2のデータが描画されたか否かを判断することで、衝突検出対象オブジェクトの他のオブジェクトの衝突のみならず、衝突検出対象オブジェクトの自己衝突等についても判定できるようになる。
【0021】
また本発明の一態様では、前記処理部は、前記衝突検出対象オブジェクトの描画処理の結果に基づいて、前記衝突検出対象オブジェクトの前面の次に前記衝突検出対象オブジェクトの背面が描画されたと判断した場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突しなかったと判定してもよい。
【0022】
このようにすれば、衝突検出対象オブジェクトの前面の次に背面が描画された場合に、当該処理対象ピクセルにおいては衝突検出対象オブジェクトと他のオブジェクトの衝突が発生していないと判定できるようになる。
【0023】
また本発明の一態様では、1画面分の描画処理が終了した後に、前記第2の深度バッファーの第2の深度値が前記第1の深度バッファーに書き込まれてもよい。
【0024】
このようにすれば、描画処理によって更新された第2の深度バッファーの第2の深度値を第1の深度バッファーに書き込んで、書き込まれた第2の深度値を第1の深度バッファーの第1の深度値として扱って、次の描画処理における深度判定処理等を行うことが可能になる。
【0025】
また本発明の一態様では、前記描画部は、無限遠の前記視点での平行投影で描画処理を行ってもよい。
【0026】
このように、一般的な三次元画像の描画処理とは異なり、平行投影で描画処理を行うことで、より正確な衝突判定を実現できるようになる。
【0027】
また本発明の一態様では、前記衝突検出対象オブジェクトは、ロボットをモデル化したオブジェクトであってもよい。
【0028】
また本発明の他の態様は、上記のいずれかに記載の衝突検出システムを含むロボットシステムに関係する。
【0029】
また本発明の他の態様は、第1の深度バッファーを参照して、衝突検出対象オブジェクトと、衝突検出対象オブジェクト以外の他のオブジェクトの描画処理を行い、処理対象ピクセルの深度値が、前記第1の深度バッファーの第1の深度値より所定の視点から見て後方における最前面の深度値である場合に、第2の深度バッファーの第2の深度値を前記処理対象ピクセルの深度値に更新し、前記衝突検出対象オブジェクトの描画処理の結果に基づいて、前記衝突検出対象オブジェクトの前記所定の視点から見たときの前面と背面の間に前記他のオブジェクトが存在するか否かを判断し、前記衝突検出対象オブジェクトの前記所定の視点から見たときの前面と背面の間に、前記他のオブジェクトが存在すると判断された場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突したと判定する衝突検出方法に関係する。
【0030】
また本発明の他の態様は、処理部と、描画処理を行う描画部と、深度情報を記憶する第1の深度バッファーと、深度情報を記憶する第2の深度バッファーとして、コンピューターを機能させ、前記描画部は、前記第1の深度バッファーを参照して、衝突検出対象オブジェクトと、衝突検出対象オブジェクト以外の他のオブジェクトの描画処理を行い、処理対象ピクセルの深度値が、前記第1の深度バッファーの第1の深度値より所定の視点から見て後方における最前面の深度値である場合に、前記第2の深度バッファーの第2の深度値を前記処理対象ピクセルの深度値に更新し、前記処理部は、前記衝突検出対象オブジェクトの描画処理の結果に基づいて、前記衝突検出対象オブジェクトの前記所定の視点から見たときの前面と背面の間に、前記他のオブジェクトが存在すると判断した場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突したと判定するプログラムに関係する。
【図面の簡単な説明】
【0031】
【図1】図1(A)〜図1(C)は深度バッファー処理の説明図。
【図2】図2(A)〜図2(D)も深度バッファー処理の説明図。
【図3】図3(A)〜図3(C)は従来技術の問題点についての説明図。
【図4】本実施形態の衝突検出システムの構成例。
【図5】本実施形態の衝突検出システムを含むロボットシステムの例。
【図6】図6(A)、図6(B)は衝突検出対象オブジェクトや他のオブジェクトや第1、第2の深度値の説明図。
【図7】図7(A)、図7(B)は本実施形態の衝突検出手法の説明図。
【図8】図8(A)、図8(B)も本実施形態の衝突検出手法の説明図。
【図9】図9(A)、図9(B)も本実施形態の衝突検出手法の説明図。
【図10】図10(A)〜図10(D)は本実施形態の衝突判定の基本原理の説明図。
【図11】図11(A)、図11(B)はマスクデータを用いて衝突を判定する手法の説明図。
【図12】図12(A)〜図12(D)はマスクデータや描画データを用いて衝突を判定する手法の説明図。
【図13】本実施形態の詳細な処理を示すフローチャート。
【図14】本実施形態の詳細な処理を示すフローチャート。
【発明を実施するための形態】
【0032】
以下、本発明の好適な実施の形態について詳細に説明する。なお以下に説明する本実施形態は特許請求の範囲に記載された本発明の内容を不当に限定するものではなく、本実施形態で説明される構成の全てが本発明の解決手段として必須であるとは限らない。
【0033】
1.深度バッファー処理
ロボット(マニピュレーター)の動作においては、周辺構造物や周辺機器への衝突や、自己衝突や、他のロボットへの衝突は非常に大きな問題となる。本実施形態の衝突検出手法では、このような衝突をシミュレーションにより事前に検出する。
【0034】
このような本実施形態の衝突検出手法が用いられる形態としては、大別して、オフラインでの使用(事前確認)と、ラインタイムでの使用(予測、先読み)が考えられる。オフラインの使用では、周辺環境などが既知且つ静的であり、ロボットの動作が既知である場合に、システムの作成時に、その衝突を検証する。一方、ラインタイムの使用では、周辺環境などが動的に変化する場合(例えば周囲に複数のロボットが存在したり、作業者が存在する場合)に、ロボットの実際の動作に先行して、シミュレーションにより衝突を検出する。
【0035】
従来では、このようなロボットにおける衝突検出手法として、CPU(Central Processing Unit)の処理に適したアルゴリズムを使用する場合が殆どであった。ここでCPU処理に適したアルゴリズムとは、比較的に複雑な単位処理を、比較的に少数(数十から数百程度)の並列度で処理するようなアルゴリズムである。
【0036】
しかしながら、近年では、消費電力の問題等に起因して、CPUの動作周波数の伸びは止まっている。このため、最近のCPUの性能向上は、マルチコア化などの処理の並列度の向上によって実現されている。別の言い方をすれば、並列度を上げることができないアルゴリズムでは、処理性能を向上できなくなっている。
【0037】
一方、GPU(Graphics Processing Unit)は、CPUに比べて非常に大きな並列度を有する。例えば現在のGPUは、ALU(算術演算ユニット)を数百から千数百持ち、数万から数百万の処理を並列に実行できる能力を有する。
【0038】
そこで本実施形態では、衝突検出のアルゴリズムとして、CPU処理よりはGPU処理に適したアルゴリズムを採用することで、従来に比べて高性能な衝突検出を実現する。具体的には、GPUが有するハードウェアー機能であるROP(レンダリング・アウトプット・パイプライン)の機能を最大限に利用する。即ち、このようなROP機能を用い、深度テスト機能と深度バッファーを有効活用して衝突検出を実現する。
【0039】
ここで深度バッファーは、CG(Computer Graphics)においては主に隠面消去のために用いられ、オブジェクトの深度情報を記憶するものである。具体的にはピクセル単位で深度値(Z値)を記憶する。また、深度情報とは、ピクセル毎の深度値に係る情報である。以下、深度バッファーを用いた深度バッファー処理(Zバッファー処理)について説明する。
【0040】
深度バッファー処理では、ある点を描画する際に、その点の深度値と、深度バッファーに記憶されている深度値を比較する。そして、その点の深度値が大きければ(右手系の場合)、その点のカラー値でカラーバッファーの値を上書きすると共に、その点の深度値で深度バッファーの値を更新する。
【0041】
例えばオブジェクトOBA、OBB、OBCが図1(A)、図1(B)に示すように配置されていたとする。図1(A)はオブジェクトOBA、OBB、OBCを上方の視点から見た場合の図であり、図1(B)は前方斜め上の視点から見た場合の図である。ここでオブジェクトは、現実世界の物体をモデル化したものであり、例えば複数のプリミティブ面により構成される。プリミティブ面は、オブジェクトの構成要素であるプリミティブとなる面であり、例えばポリゴン、自由曲面、或いはサブディビジョンサーフェスなどである。
【0042】
図1(C)に示すように、深度バッファーを用いた描画処理では、各ピクセルのカラー値(RGBの色情報)が描画バッファー(カラーバッファー)に書き込まれ、深度値(Z値)が深度バッファー(Zバッファー)に書き込まれる。
【0043】
具体的には図2(A)では深度バッファーの深度値が初期値である最背面値に設定される。そして図2(B)ではオブジェクトOBAが描画されている。この場合に図2(B)のJ1に示す領域でのオブジェクトOBAの各ピクセルの深度値は、図2(A)での深度バッファーの深度値よりも前方側(手前側)の深度値となっている。従って、J1に示す領域では、オブジェクトOBAのカラー値が描画バッファーに書き込まれると共に、オブジェクトOBAの深度値が深度バッファーに書き込まれて深度値が更新される。
【0044】
図2(C)ではオブジェクトOBBが描画されている。この場合に図2(C)のJ2に示す領域でのオブジェクトOBBの各ピクセルの深度値は、深度バッファーの深度値よりも後方側(奥側)の深度値となっている。従って、J2に示す領域では、オブジェクトOBBは隠面消去されたと判断され、オブジェクトOBBのカラー値は描画バッファーには書き込まれず、図2(D)のJ3に示すように深度バッファーの深度値も更新されない。
【0045】
一方、J4に示す領域でのオブジェクトOBBの各ピクセルの深度値は、深度バッファーの深度値よりも前方側の深度値となっている。従って、J4に示す領域では、オブジェクトOBBのカラー値が描画バッファーに書き込まれると共に、図2(D)のJ5に示すようにオブジェクトOBBの深度値が深度バッファーに書き込まれて深度値が更新される。そして、図2(D)でオブジェクトOBCが描画されると、上記と同様の手法により、J6の領域ではカラー値の書き込みや深度値の更新が行われず、J7の領域ではカラー値の書き込みと深度値の更新が行われる。
【0046】
以上のような深度バッファー処理を行うことで、描画の順番に依存せずに、奥行き方向での順番が正しく判定され、図1(C)に示すように適切な隠面消去が行われた画像が生成されるようになる。
【0047】
さて、前述した特許文献1の従来技術においても、深度バッファーを利用して衝突判定を行っている。例えば、他のオブジェクトの描画により、深度バッファーの深度値が図3(A)に示すようになっていたとする。この場合に図3(B)のH1に示すように、オブジェクトOBA1では、その深度値がZバッファーの深度値とは異なるため、OBA1は他のオブジェクトと衝突していないと判定される。一方、H2、H3に示すように、オブジェクトOBA2では、その深度値が深度バッファーの深度値と同一になっている。従って、オブジェクトOBA2は、この深度バッファーの深度値を持った他のオブジェクトと衝突していると判定される。
【0048】
しかしながら、この特許文献1の従来技術では図3(C)に示すような問題点がある。図3(C)では、他のオブジェクトOBDの描画により深度バッファーの深度値がH4に示すようになっている。この場合に、H5に示すようにオブジェクトOBA3はオブジェクトOBDと衝突しているのにも関わらず、オブジェクトOBA3の深度値は深度バッファーの深度値と一致していないため、衝突していないと判定されてしまう。またH6に示すように深度値が内挿された場合には、オブジェクトOBA4はオブジェクトOBDと衝突していないのに、衝突していると判定されてしまう。
【0049】
また、他の手法として、仮想的な視点を、地面等を表す平面状のオブジェクトの背面に設定し、背面から見て、表面にあるはずのオブジェクトが描画されれば、そのオブジェクトが平面と衝突していると判定する手法も考えられる。しかしながら、この手法では、単純な平面が仮定されているが、それが平面ではなく複雑な構造を持つオブジェクト(例えば非凸)である場合には、片方の面との衝突が、別の面によって遮蔽される可能性があり、このような場合には衝突を検出できなくなる。
【0050】
2.構成
以上のような問題を解決できる本実施形態の衝突検出システムの構成例を図4に示す。なお本実施形態の衝突検出システムの構成は図4の構成には限定されず、その一部の構成要素(例えば操作部、外部I/F部等)を省略したり、他の構成要素を追加するなどの種々の変形実施が可能である。
【0051】
この衝突検出システムは、処理部10と、描画処理を行う描画部30と、記憶部50(深度バッファー)を含む。また操作部70、外部I/F(インターフェース)部80、情報記憶媒体90を含むことができる。
【0052】
処理部10は、各種の判定処理や制御処理などを行うものであり、例えばCPU等の各種のプロセッサー、専用回路(ASIC)などのハードウェアーや、プロセッサー上で実行されるプログラムなどにより実現できる。処理部10は、オブジェクト空間設定部12、衝突判定部14を含む。
【0053】
オブジェクト空間設定部12は、複数のオブジェクトをオブジェクト空間に配置設定する処理等を行う。具体的には、ワールド座標系でのオブジェクトの位置や回転角度を決定し、その位置にその回転角度でオブジェクトを配置する。ここでオブジェクトは、ロボット等の衝突検出対象物や、周辺構造物や周辺機器などの被衝突検出対象物を、モデル化したものであり、ポリゴンや自由曲面などのプリミティブ面で構成される。
【0054】
衝突判定部14は、衝突検出対象オブジェクトと他のオブジェクト(被衝突検出対象オブジェクト)との間の衝突判定処理を行うものである。衝突判定部14は、マスク画像生成部16、画像比較部18、マスクデータ生成部20を含む。
【0055】
描画部30は、描画処理を行うものであり、例えばGPU等の各種のプロセッサー、専用回路(ASIC)などのハードウェアーや、プロセッサー上で実行されるプログラムなどにより実現できる。描画部30は、深度値判定部32、深度値更新部34、深度値コピー部36を含む。この描画部30での描画処理は、頂点シェーダープログラムにより実現される頂点シェーダーや、ピクセルシェーダープログラムにより実現されるピクセルシェーダーにより実現してもよい。頂点シェーダーでは、頂点の移動処理、座標変換処理、クリッピング処理などが行われる。そして頂点処理後の頂点データに基づいてラスタライズ処理が行われる。またピクセルシェーダーでは、ラスタライズ処理後に、画像を構成するピクセル(フラグメント)単位での処理であるピクセル処理(フラグメント処理)が行われる。即ち、シェーディング言語によって記述されたシェーダープログラムによって、プログラマブルシェーダー処理が実現される。
【0056】
記憶部50は、処理部10や描画部30などのワーク領域となるもので、RAM(SRAM、DRAM等)などのメモリーにより実現できる。この記憶部50は、オブジェクトデータ記憶部52、描画バッファー54、第1、第2の深度バッファー56、58、マスクデータ記憶部60を含む。
【0057】
オブジェクトデータ記憶部52は、オブジェクトの位置データや回転角度データや形状データなどのオブジェクトデータを記憶する。描画バッファー54(カラーバッファー、フレームバッファー)は画像情報(描画データ)を記憶するものであり、具体的には、ピクセル単位でカラー値やα値などの画像情報を記憶する。第1、第2の深度バッファー56、58(Zバッファー)は、深度情報を記憶するものであり、具体的にはピクセル単位で深度値(Z値)を記憶する。これらの描画バッファー54、第1、第2の深度バッファー56、58は、記憶部50を構成するメモリー上に記憶領域として確保される。またマスクデータ記憶部60は、マスクデータ生成部20により生成されたマスクデータを記憶する。
【0058】
操作部70は、使用者が各種の操作情報を入力するためのものである。外部I/F部80は、外部との間で有線や無線で情報の通信処理等を行うものである。情報記憶媒体90は(コンピューターにより読み取り可能な媒体)は、プログラムやデータなどを格納するものであり、その機能は、光ディスク、HDD、或いはメモリーなどにより実現できる。処理部10は、情報記憶媒体90に格納されるプログラム(データ)に基づいて本実施形態の種々の処理を行う。即ち情報記憶媒体90には、本実施形態の各部としてコンピューター(操作部、処理部、記憶部、出力部を備える装置)を機能させるためのプログラム(各部の処理をコンピューターに実行させるためのプログラム)が記憶される。
【0059】
そして本実施形態の衝突検出システムでは、描画部30は、第1の深度バッファー56を参照して、衝突検出対象オブジェクトと、衝突検出対象オブジェクト以外の他のオブジェクトの描画処理を行う。そして処理対象ピクセルの深度値が、第1の深度バッファー56の第1の深度値より所定の視点(描画処理における視点)から見て後方における最前面の深度値である場合に、第2の深度バッファー58の第2の深度値を処理対象ピクセルの深度値に更新する。即ち、処理対象ピクセルが、第1の深度バッファー56の第1の深度値より後方における最前面のプリミティブ面のピクセルである場合に、当該処理対象ピクセルの深度値が、第2の深度バッファー58の対応するピクセル位置に書き込まれる。例えば後述する図7(B)のC1やC2に示すように第2の深度値が更新される。なお、この場合の深度値の判定処理は深度値判定部32が行い、深度値の更新処理は深度値更新部34が行う。また本実施形態では描画部30は、無限遠の視点(広義には所定の視点)での平行投影で描画処理を行う。
【0060】
そして処理部10は、衝突検出対象オブジェクトの描画処理の結果に基づいて、衝突検出対象オブジェクトの、所定の視点から見たときの前面と背面の間に、他のオブジェクトが存在すると判断した場合に、衝突検出対象オブジェクトが他のオブジェクトに衝突したと判定する。
【0061】
例えば後述する図7(B)のC4は衝突検出対象オブジェクトPB2の前面(表面)であり、図8(B)のE4は衝突検出対象オブジェクトPB2の背面(裏面)である。そして図8(A)のD4では、衝突検出対象オブジェクトPB2の前面と背面の間に他のオブジェクトOB3(OB3の面)が存在すると判断されるため、衝突検出対象オブジェクトPB2が他のオブジェクトOB3に衝突したと判定される。
【0062】
更に具体的には本実施形態の衝突検出システムは、描画部30により描画データが書き込まれる描画バッファー54を含む。そして処理部10は、描画バッファー54に書き込まれた描画データに基づいて、衝突検出対象オブジェクトの衝突判定を行う。
【0063】
例えば後述する図12(A)のH1、H2では、衝突検出対象オブジェクトの前面や背面の描画データとして「1」が描画バッファー54に書き込まれる。そして、この描画バッファー54に書き込まれた描画データに基づいて衝突判定が行われる。また図12(C)のI1では、衝突検出対象オブジェクトの前面の描画データとして第1のデータである「1」が描画バッファー54に書き込まれる。またI2では衝突検出対象オブジェクトの背面の描画データとして第2のデータである「−1」が描画バッファー54に書き込まれる。そして、この描画バッファー54に書き込まれた描画データに基づいて衝突判定が行われる。
【0064】
更に具体的には描画部30は、処理対象ピクセルの深度値が、第1の深度バッファー56の第1の深度値より、所定の視点から見て後方における最前面の深度値であり、且つ、衝突検出対象オブジェクトの深度値である場合には、第2の深度バッファー58の第2の深度値を処理対象ピクセルの深度値に更新して、描画バッファー54に描画データを書き込む。例えば図7(B)のC4は衝突検出対象オブジェクトPB2の前面であるため、「1」の描画データが書き込まれる。同様に図8(B)のE4は衝突検出対象オブジェクトPB2の背面であるため、「1」の描画データが書き込まれる。
【0065】
一方、描画部30は、処理対象ピクセルの深度値が、第1の深度バッファー56の第1の深度値より、所定の視点から見て後方における最前面の深度値であり、且つ、衝突検出対象オブジェクト以外の他のオブジェクトの深度値である場合には、描画バッファー54に描画データを書き込むことなく、第2の深度バッファー58の第2の深度値を処理対象ピクセルの深度値に更新する。例えば図8(A)のD4は他のオブジェクトOB3の背面であるため、描画バッファー54に「1」の描画データは書き込まれず、描画バッファー54には初期値である「0」が書き込まれたままになる。
【0066】
そして処理部10は、第1の描画処理において衝突検出対象オブジェクトの前面が描画され、第1の描画処理の次の第2の描画処理において衝突検出対象オブジェクトの背面が描画されなかったことが、描画バッファー54の描画データに基づき検出された場合に、衝突検出対象オブジェクトが他のオブジェクトに衝突したと判定する。
【0067】
例えば後述する図10(C)のG1では、第1の描画処理において衝突検出対象オブジェクトPBの前面が描画されている。一方、図10(D)のG2では、第2の描画処理において衝突検出対象オブジェクトPBの背面が描画されておらず、他のオブジェクトOBの背面が描画されている。このような場合、衝突検出対象オブジェクトPBの描画時の描画データを「1」とすると、図10(C)の第1の描画処理では、図12(B)のH3に示すように「1」の描画データが描画バッファー54が書き込まれる。一方、図10(D)の第2の描画処理では、図12(B)のH4に示すように「1」の描画データは書き込まれず、描画データは初期値である「0」のままになる。従って、この場合には、他のオブジェクトとの衝突が発生したと判定する。
【0068】
また本実施形態では、後述する図11(A)、図11(B)で説明するように、第1の描画処理において衝突検出対象オブジェクトの前面が描画された場合に第1の論理レベル(例えば「1」)になるマスクデータが生成される。ここで第1の論理レベルは、例えば二値化されたデジタルデータの一方の論理レベルである。またマスクデータは、例えば衝突検出対象オブジェクトの前面が描画された直後であることを示すデータである。
【0069】
そして処理部10は、図10(A)、図10(C)の第1の描画処理で生成されたマスクデータが第1の論理レベル「1」であり、図10(B)、図10(D)の第2の描画処理において衝突検出対象オブジェクトの背面が描画されなかったことが描画バッファー54の描画データに基づき検出された場合に、衝突検出対象オブジェクトが他のオブジェクトに衝突したと判定する。例えば図11(B)や図12(B)のH3、H4に示すように、マスクデータが「1」であり、描画データが「0」である場合には、衝突が発生したと判定する。なおマスクデータはマスクデータ生成部20が生成する。また後述するマスク画像はマスク画像生成部16が生成し、マスクデータやマスク画像を用いた画像の比較処理は、画像比較部18が行う。
【0070】
また描画部30は、衝突検出対象オブジェクトの前面を描画する場合には、描画データとして第1のデータを描画バッファー54に書き込み、衝突検出対象オブジェクトの背面を描画する場合には、描画データとして第1のデータとは異なる第2のデータを描画バッファー54に書き込んでもよい。例えば図12(C)のI1では、衝突検出対象オブジェクトの前面が描画されたため、第1のデータである「1」が描画バッファー54に書き込まれる。一方、図12(C)のI2では、衝突検出対象オブジェクトの背面が描画されたため、第2のデータである「−1」が描画バッファー54に書き込まれる。
【0071】
そして処理部10は、第1の描画処理において第1のデータが描画バッファー54に書き込まれ、第1の描画処理の次の第2の描画処理において、第2のデータが描画バッファー54に書き込まれなかった場合に、衝突検出対象オブジェクトについての衝突が発生したと判定する。例えば図12(D)のI3では、衝突検出対象オブジェクトの前面が描画されているため、第1のデータである「1」の描画データが描画バッファー54に書き込まれている。一方、I4では、第2のデータである「−1」の描画データは書き込まれていない。
【0072】
即ち図12(C)のI1、I2では、衝突検出対象オブジェクトの前面に対応する第1のデータ「1」と、背面に対応する第2のデータ「−1」が連続して書き込まれているため、衝突が発生していないと判定する。これに対して図12(D)のI3、I4では、前面に対応する第1のデータ「1」の次に同じ第1のデータ「1」が描画されているため、衝突が発生したと判定する。具体的には、この場合には例えば自己衝突が発生したと判定される。
【0073】
なお処理部10は、衝突検出対象オブジェクトの描画処理の結果に基づいて、衝突検出対象オブジェクトの前面の次に衝突検出対象オブジェクトの背面が描画されたと判断した場合に、衝突検出対象オブジェクトが他のオブジェクトに衝突しなかったと判定する。例えば図7(A)のB2では衝突検出対象オブジェクトPB1の前面が描画され、次の図7(B)のC2では衝突検出対象オブジェクトPB1の背面が描画されている。従って、この場合には衝突検出対象オブジェクトが他のオブジェクトに衝突しなかったと判定される。
【0074】
なお、1画面分の描画処理が終了した後に、第2の深度バッファー58の第2の深度値は、第1の深度バッファー56に書き込まれる(コピーされる)。この深度値の書き込み(コピー)は深度値コピー部36が行う。例えば第1の深度バッファー56に、第2の深度バッファー58の第2の深度値がコピーされて上書きされる。これにより、前回の描画処理で更新された第2の深度バッファー58の第2の深度値を、第1の深度バッファー56に書き込んで(コピーして)、次回の描画処理を行うことが可能になる。
【0075】
なお、衝突検出対象オブジェクトは、他のオブジェクトとの衝突検出対象となるオブジェクトであり、例えばロボットをモデル化したオブジェクトなどである。また、プリミティブ面がポリゴンである場合を例にとると、三角形を構成する3頂点が、視点から見て例えば反時計回りに見える面が表面(front surface, front-facing surface)になり、視点から見て例えば時計回りに見える面が裏面(back surface, back-facing surface)になる。閉じたオブジェクトの表面が外を向いていることを前提にすると、表面を前面、裏面を背面と記述することができる。
【0076】
以上のように本実施形態では、第1、第2の深度バッファー56、58が設けられ、これらの第1、第2の深度バッファー56、58を用いて衝突対象オブジェクト及び他のオブジェクトの描画処理が行われる。そして、描画処理の結果に基づいて、衝突検出対象オブジェクトの前面と背面の間に他のオブジェクトが存在すると判断されると、衝突が発生したと判断される。即ち、本実施形態の手法は、全てのオブジェクト(物体)の表面の深度値を、前面から順に描画して行けば、オブジェクトに衝突が発生していなければ、オブジェクトの前面を描画した後に、必ずオブジェクトの背面が描画されるという原理に基づいている。即ちオブジェクトの前面と背面の間に、別の面が描画されれば、それは衝突が発生したことを意味する。
【0077】
例えば衝突検出対象オブジェクトを描画するときには、例えば「1」の描画データを描画し、そうでない場合にはなにも描画しない、つまり0であるとする。すると処理対象ピクセルについて、図12(A)のH1、H2に示すように、「1」の描画データが連続していた場合には、衝突は発生していないと判定できる。一方、図12(B)のH3、H4に示すように、「1」の後に「0」が来る場合には、衝突が発生していると判定できる。
【0078】
また衝突検出対象オブジェクトの前面を、例えば第1のデータである「1」の描画データで描画し、背面を、例えば第2のデータである「−1」で描画したとする。すると図12(C)のI1、I2に示すように「1」の後に「−1」が来た場合には、衝突が発生していないと判定できる。一方、図12(D)のI3、I4に示すように、「1」の後に「−1」が来ない場合には、衝突が発生したと判定できる。
【0079】
以上のように本実施形態によれば、深度バッファー処理を有効活用した高速(正確)な衝突判定(近接判定)を実現できる。即ち、衝突(近接)の問題を、最新の描画ハードウェアー処理に適した遮蔽処理に置き換えることで、非常に高速に、衝突判定(近接判定)を行うことが可能になる。
【0080】
なお本実施形態のオブジェクトの描画処理では、描画部30は無限遠の視点での平行投影で描画処理を行っている。
【0081】
即ち、通常の3DCGにおいては、パースのついた画像を生成するために透視投影で描画処理を行うのが一般的である。この点、本実施形態では、3DCGの画像生成のためではなく、衝突判定のために深度バッファー処理を利用している。そして透視投影で描画処理を行うと、正確な衝突判定を実現できなくなるおそれがあり、本実施形態では、この点に着目して平行投影で描画処理を行っている。
【0082】
図5に本実施形態の衝突検出システムを含むロボットシステムの例を示す。このロボットシステムは、制御装置300(情報処理装置)とロボット310とを含む。制御装置300はロボット310の制御処理を行う。具体的には、動作シーケンス情報(シナリオ情報)に基づいてロボット310を動作させる制御を行う。ロボット310は、アーム320及びハンド(把持部)330を有する。そして制御装置300からの動作指示にしたがって動作する。例えば、図示しないパレットに載せられたワークを把持したり、移動するなどの動作を行う。また、図示しない撮像装置で取得された撮像画像情報に基づいて、ロボットの姿勢やワークの位置などの情報が検出され、検出された情報が制御装置300に送られる。
【0083】
本実施形態の衝突検出システムは例えば図5の制御装置300に設けられ、例えば制御装置300のハードウェアーやプログラムにより衝突検出システムが実現される。そして、ラインタイムの使用では、周辺環境などが動的に変化する場合に、ロボット310の実際の動作に先行して、本実施形態の衝突検出システムがシミュレーションにより衝突の判定処理を行う。そして制御装置300は、ロボット310が周辺構造物や周辺機器などに衝突しないように、判定処理の結果に基づいてロボット310の制御を行う。一方、オフラインの使用では、本実施形態の衝突検出システムにより、動作シーケンス情報等の作成時にシミュレーションにより衝突を検証する。そして制御装置300は、衝突が起こらないように作成された動作シーケンス情報(シナリオ情報)に基づいて、ロボット310を制御する。
【0084】
3.本実施形態の手法
次に本実施形態の手法について図面を用いて更に詳細に説明する。
【0085】
自己衝突を考慮しなくてもよい場合には、本実施形態では以下の手法により衝突を検出する。即ち本実施形態では第1の深度バッファー56の第1の深度値と第2の深度バッファー58の第2の深度値を用いる。具体的には、第1の深度値よりも後方(奥側)で、且つ最前面(第2の深度値)のオブジェクトを描画対象とする。この時、衝突検出対象オブジェクトについては、実際に描画を行い、且つ深度値を更新する。一方、衝突検出対象オブジェクト以外のオブジェクトについては、深度値のみを更新し、描画は行わない。
【0086】
そして1画面分の描画が行われるごとに、第2の深度バッファー58の第2の深度値を第1の深度バッファー56の第1の深度値へコピーし、深度値の全てが最背面に到達するまで描画を行う。或いは、全ての衝突検出対象オブジェクトの背面を描画し終えるまで描画を行う。つまり前方の面から、1面ずつ描画を行うということである。そして、衝突検出対象オブジェクトがなにかと衝突していなければ、その前面を描画した次のステップで、必ずその背面が描画される。一方、衝突検出対象オブジェクトがなにかと衝突していれば、衝突検出対象オブジェクトの前面と背面の間に、別のオブジェクトが介在することを意味する。
【0087】
更に具体的には本実施形態では、1画面分の描画が行われた後、以下の処理が行われる。まずマスクデータ記憶部60に記憶されるマスクデータと描画データとの論理積がとられて、マスク画像が生成される。そして、生成されたマスク画像とマスクデータが比較され、それらが一致していれば、その時点では衝突は検出されないと判断する。一方、一致していなければ、衝突が検出されたと判断する。
【0088】
衝突が検出されない場合、以下の処理が行われる。まず、第2の深度値を、新規の第1の深度値としてコピーする。そしてマスクデータと描画データの排他的論理和がとられ、得られたデータと描画データとの論理積がとられ、得られたデータを新規のマスクデータとしてマスクデータ記憶部60に記憶する。
【0089】
以上の処理を、第1の深度値の全てが最背面に到達するまで行う。そして衝突が検出されずに最背面に到達すれば、衝突は発生しなかったと判断する。
【0090】
次に図6(A)〜図12(D)を用いて本実施形態の衝突検出手法について更に詳細に説明する。
【0091】
例えば図6(A)、図6(B)において、PB1、PB2、PB3は、衝突検出対象オブジェクトであり、OB1、OB2、OB3は、衝突検出対象オブジェクト以外の他のオブジェクト(被衝突検出対象オブジェクト)である。ロボットシステムに用いられる衝突検出システムを例にとれば、PB1、PB2、PB3は、現実世界のロボットをモデル化したロボットオブジェクト、或いはロボットオブジェクトを構成するパーツオブジェクトである。またOB1、OB2、OB3は、周辺構造物や周辺機器をモデル化したオブジェクト、或いはそのパーツオブジェクトである。なおパーツオブジェクトは、衝突検出対象オブジェクトなどのモデルオブジェクトを構成する部分となるオブジェクトである。例えば衝突検出対象オブジェクトなどのモデルオブジェクトは、複数のパーツオブジェクトと、パーツオブジェクト間を接続する関節部分などにより構成される。
【0092】
図6(B)において、DP1は、第1の深度バッファー56に設定される第1の深度値(第1の深度分布)であり、DP2は、第2の深度バッファー58に設定される第2の深度値(第2の深度分布)である。図6(B)に示すように初期状態では、第1の深度バッファー56の第1の深度値DP1は最前面値に設定され、第2の深度バッファー58の第2の深度値DP2は最背面値に設定される。そして図6(B)では、衝突検出対象であるオブジェクトPB1は、他のオブジェクトであるOB1、OB2、OB3と衝突していないが、衝突検出対象であるオブジェクトPB2、PB3は、他のオブジェクトであるOB3と衝突している。
【0093】
図6(B)においてオブジェクトPB1〜PB3、OB1〜OB3の描画処理を行う。そして処理対象ピクセルの深度値が、第1の深度バッファー56の第1の深度値DP1よりも後方(奥側)の最前面の深度値である場合に、第2の深度バッファー58の第2の深度値DP2が、処理対象ピクセルの深度値に置き換えられて更新される。
【0094】
例えば図6(B)のA1、A2、A3、A4、A5は、第1の深度値DP1よりも後方における最前面になる。従って、この場合には、図7(A)のB1、B2、B3、B4、B5に示すように第2の深度値DP2が更新される。即ち第2の深度値DP2は、図7(A)のB1では、オブジェクトOB1の前面の深度値に更新され、B2では、オブジェクトPB1の前面の深度値に更新される。また第2の深度値DP2は、B3では、オブジェクトOB2の前面の深度値に更新され、B4では、オブジェクトOB3の前面の深度値に更新され、B5では、オブジェクトPB3の前面の深度値に更新される。
【0095】
そして図7(A)のB2、B5の処理対象ピクセルは、衝突検出対象のオブジェクトPB1、PB3に属している。従って、後述する図12(A)に示すように、B2、B5の処理対象ピクセルについては、「1」の描画データが描画バッファー54に書き込まれることになる。一方、図7(A)のB1、B3、B4の処理対象ピクセルは、衝突検出対象以外の他のオブジェクトOB1、OB2、OB3に属している。従って、B1、B3、B4の処理対象ピクセルでは、「1」の描画データは書き込まれず、描画データは「0」のままとなる。なお描画バッファー54の描画データは、初期状態において「0」にクリアされている。
【0096】
次に、1画面分の描画処理が終了すると、図7(B)に示すように、図7(A)で更新された第2の深度値DP2が、第1の深度バッファー56の第1の深度値DP1にコピーされる。そして、上述と同様の描画処理及び深度値の更新処理が行われる。
【0097】
例えば図7(B)のC1、C2、C3、C4、C5は、第1の深度値DP1よりも後方の最前面になる。従って、同図に示すように第2の深度値DP2が更新される。
【0098】
この場合に図7(B)のC2、C4の処理対象ピクセルは、衝突検出対象のオブジェクトPB1、PB2に属しているため、「1」の描画データが描画バッファー54に書き込まれることになる。一方、C1、C3、C5の処理対象ピクセルは、他のオブジェクトOB1、OB2、OB3に属しているため、「1」の描画データは書き込まれないことになる。
【0099】
以上のようにして、図8(A)ではD1、D2、D3、D4、D5に示すように第2の深度値DP2の更新が行われ、描画バッファー54への描画データの書き込みが行われる。また図8(B)ではE1、E2、E3、E4、E5に示すように第2の深度値DP2の更新が行われ、描画バッファー54への描画データの書き込みが行われる。図9(A)、図9(B)も同様である。また図8(A)のD1では、第2の深度値DP2は最背面に到達したため、この処理対象ピクセルについての第2の深度値DP2の更新は終了することになる。
【0100】
そして本実施形態では図10(A)〜図10(D)に示す原理により、衝突検出対象オブジェクトの衝突判定を行っている。
【0101】
例えば図10(A)のF1では、第1の描画処理において、衝突検出対象オブジェクトPBの前面が描画されている。そして図10(B)のF2では、第1の描画処理による1画面分の描画が行われた後の次の第2の描画処理において、衝突検出対象オブジェクトPBの背面が描画されている。このように、衝突検出対象オブジェクトPBの前面と背面が連続して描画された場合には、衝突検出対象オブジェクトPBは他のオブジェクトOBと衝突していないと判定される。
【0102】
一方、図10(C)のG1では、第1の描画処理において、衝突検出対象オブジェクトPBの前面が描画されている。そして図10(D)のG2では、第1の描画処理の次の第2の描画処理において、衝突検出対象オブジェクトPBの背面ではなく、他のオブジェクトOBの背面が描画されている。従って、この場合には衝突検出対象オブジェクトPBの前面と背面の間に他のオブジェクトOBの面が存在するため、衝突検出対象オブジェクトPBが他のオブジェクトOBと衝突したと判定される。
【0103】
例えば図7(A)のB2では、衝突検出対象オブジェクトPB1の前面が描画され、次の描画処理である図7(B)のC2では、衝突検出対象オブジェクトPB1の背面が描画されている。従って、この場合には衝突検出対象オブジェクトPB1の前面の直後に背面が描画されているため、衝突が発生していないと判定される。
【0104】
一方、図7(B)のC4では、衝突検出対象オブジェクトPB2の前面が描画されているが、次の描画処理である図8(A)のD4では、衝突検出対象オブジェクトPB2の背面ではなく、他のオブジェクトOB3の背面が描画されている。従って、この場合には、衝突検出対象オブジェクトPB2が他のオブジェクトOB3と衝突したと判定される。
【0105】
同様に図8(A)のD3と図8(B)のE3では、衝突検出対象オブジェクトPB1についての衝突は発生していないと判定される。一方、図8(A)のD5と図8(B)のE5では、衝突検出対象オブジェクトPB3と他のオブジェクトOB3の衝突が発生したと判定される。
【0106】
以上のように本実施形態によれば、深度バッファーの深度値を用いた効率的な衝突判定を実現できる。従って、最新の並列化ハードウェアーにより、高速に衝突を検出することが可能になる。
【0107】
次に、マスクデータを用いた衝突判定について詳細に説明する。図11(A)に、マスクデータを用いた衝突判定を実現する構成の機能ブロック図を示し、図11(B)にマスクデータ等についての真理値表を示す。ここで、マスクデータは、衝突検出対象オブジェクトの前面が検出された直後かどうかを示すデータである。また描画データは、衝突検出対象オブジェクトのピクセル(面)の描画時に「1」(第1の論理レベル)になるデータである。
【0108】
図11(A)に示すように、論理積部110により、マスクデータと描画データの論理積(AND)がとられ、マスク画像が生成される。そして、排他的論理和部114により、論理積部110からのマスク画像と、マスクデータとの排他的論理和(XOR)がとられる。そして図11(B)の真理値表から明らかなように、マスクデータと描画データの論理積であるマスク画像と、マスクデータが不一致である場合には、排他的論理和部114の出力が「1」になり、衝突が検出されたと判定される。一方、マスク画像とマスクデータが一致した場合には、排他的論理和部114の出力が「0」になり、衝突なしと判定される。
【0109】
また、排他的論理和部112により、マスクデータと描画データの排他的論理和がとられ、論理積部116により、得られたデータと描画データの論理積がとられる。これにより、論理積部116からは、次の描画処理(1画面分の描画処理)で使用されるマスクデータが出力され、図4のマスクデータ記憶部60に記憶される。
【0110】
例えば図11(B)において、マスクデータ=1、描画データ=1の場合には、図10(A)、図10(B)に示すように衝突検出対象オブジェクトの前面と背面が連続したと判断できる。従って、衝突検出=0(衝突なし)になり、次のマスクデータ=0になる。
【0111】
またマスクデータ=1、描画データ=0の場合には、衝突検出対象オブジェクトの前面の後が、背面ではなかったと判断できる。従って、衝突検出=1(衝突あり)になり、次のマスクデータ=0になる。
【0112】
またマスクデータ=0、描画データ=1の場合には、衝突検出対象オブジェクトの前面が現れたと判断できる。従って、衝突検出=0になり、前面が検出された直後かどうかを示す次のマスクデータは1になる。またマスクデータ=0、描画データ=0の場合には、上記以外と判断できるため、衝突検出=0、次のマスクデータ=0になる。
【0113】
以上のように本実施形態では、第1の描画処理(図10(A)、図10(C))で生成されたマスクデータが「1」(第1の論理レベル)であり、第2の描画処理(図10(B)、図10(D))において衝突検出対象オブジェクトの背面が描画されなかったことが描画バッファー54の描画データに基づき検出された場合に、衝突検出対象オブジェクトが他のオブジェクトに衝突したと判定している。
【0114】
図12(A)、図12(B)は、マスクデータや描画データを用いた衝突判定を説明する図である。図12(A)のH1では、衝突検出対象オブジェクトの前面が描画され、描画データが1になるため、次のマスクデータも1になる。そしてH2では衝突検出対象オブジェクトの背面が描画されて描画データが1になり、マスクデータも1であるため、図11(B)の真理値表に示すように、衝突が検出されなかった(衝突検出=0)と判定される。
【0115】
図12(B)のH3では、衝突検出対象オブジェクトの前面が描画され、描画データが1になるため、次のマスクデータも1になる。そしてH4では衝突検出対象オブジェクトの背面は描画されず、描画データが0で、マスクデータが1であるため、図11(B)の真理値表に示すように、衝突が検出された(衝突検出=1)と判定される。
【0116】
さて、以上では、衝突検出対象オブジェクトの自己衝突を考慮しない場合について説明したが、自己衝突を考慮する場合には、衝突検出対象オブジェクトの前面と背面において、異なる値の描画データを描画すればよい。例えば衝突検出対象オブジェクトの前面を描画する場合には、描画データとして第1のデータを描画バッファー54に書き込む。一方、衝突検出対象オブジェクトの背面を描画する場合には、描画データとして第1のデータとは異なる第2のデータを描画バッファー54に書き込む。そして第1の描画処理において第1のデータが描画バッファー54に書き込まれ、次の第2の描画処理において、第2のデータが描画バッファー54に書き込まれていない場合に、衝突が発生したと判定する。
【0117】
図12(C)、図12(D)は、描画データの第1のデータが「1」であり、第2のデータが「−1」である場合の例である。図12(C)のI1では、衝突検出対象オブジェクトの前面が描画されたため、描画データは第1のデータ(=1)になり、I2では、衝突検出対象オブジェクトの背面が描画されたため、描画データは第2のデータ(=−1)となっている。従って、第1の描画処理において、前面に対応する第1のデータ(=1)が書き込まれ、第2の描画処理において、背面に対応する第2のデータ(=−1)が書き込まれているため、衝突は発生していないと判定される。
【0118】
一方、図12(D)のI3では、衝突検出対象オブジェクトの前面が描画されたため、描画データは第1のデータ(=1)になる。一方、I4でも、衝突検出対象オブジェクトの前面が描画されたため、描画データは第1のデータ(=1)となっている。従って、第1の描画処理においては、前面に対応する第1のデータ(=1)が書き込まれているが、第2の描画処理においては、背面に対応する第2のデータ(=−1)が書き込まれていないため、衝突が発生したと判定される。具体的には、図12(D)のI3とI4では前面が連続しているため、自己衝突が発生したと判定される。
【0119】
以上のようにすることで、衝突検出対象オブジェクトと他のオブジェクトの間のみならず、衝突検出対象オブジェクトの自己衝突についても検出できるようになる。なお、以上では前面を描画する場合に第1のデータ(=1)を書き込み、背面を描画する場合には第2のデータ(=−1)を書き込む場合について説明したが、本実施形態の手法はこれに限定されるものではない。例えば前面を描画する際の色と、背面を描画する際の色を異ならせ、描画色の比較処理を行うことで、自己衝突等を判定することも可能である。
【0120】
4.詳細な処理
次に本実施形態の詳細な処理例について図13、図14のフローチャートを用いて説明する。
【0121】
まず、図6(B)で説明したように、第1の深度バッファー56の深度値(DP1)を最前面値に設定し、第2の深度バッファー58の深度値(DP2)を最背面値に設定する(ステップS1、S2)。
【0122】
次に、第1の深度バッファー56の全面が最背面に到達したか否かを判断し、到達した場合には、衝突なしとして処理を終了する(ステップS3、S4)。一方、到達していないと判断された場合には、描画バッファー54をゼロクリアする(ステップS5)。即ち描画データ=0に初期化する。なおステップS3の終了条件は、全ての衝突検出対象オブジェクトの背面の描画処理が終了したかという条件であってもよい。
【0123】
次に、全ての処理対象ピクセルを処理したか否かを判断する(ステップS6)。そして全ての処理対象ピクセルの処理を終了していない場合には、未処理の処理対象ピクセルを1つ選択する(ステップS7)。
【0124】
次に、選択された処理対象ピクセルの深度値が、第1の深度バッファー56の深度値より後方における最前面か否かを判定する(ステップS8)。そして、後方の最前面ではない場合にはステップS6に戻り、後方の最前面である場合には、処理対象ピクセルの深度値が、第2の深度バッファー58の深度値より前方か否かを判断する(ステップS9)。そして前方ではない場合にはステップS6に戻り、前方である場合には、第2の深度バッファー58の深度値を、処理対象ピクセルの深度値に更新する(ステップS10)。即ち図7(A)〜図9(B)で説明したような第2の深度バッファー58の深度値DP2の更新処理を行う。
【0125】
そして、処理対象ピクセルが衝突検出対象オブジェクトならば、対応する描画バッファー54のピクセル位置に描画データ=1を描画する(ステップS11)。これにより図12(A)、図12(B)で説明したような衝突判定を実現できるようになる。
【0126】
図13のステップS6で、全ての処理対象ピクセルの処理(1画面分の描画処理)を終了したと判断した場合には、衝突判定処理を行う(ステップS12)。そして衝突が検出されか否かを判断し(ステップS13)、検出された場合には、衝突ありとして処理を終了する(ステップS14)。一方、検出されなかった場合には、第2の深度バッファー58の深度値を、第1の深度バッファー56にコピーする(ステップS15)。そして例えばステップS2に戻る。
【0127】
図14は図13のステップS12の衝突判定処理の詳細を示すフローチャートである。
【0128】
まず1回目の描画処理か否かを判断する(ステップS21)。そして1回目の描画処理(例えば図7(A)の描画処理)である場合には、得られた画像をマスクデータとしてマスクデータ記憶部60に記憶する(ステップS22)。
【0129】
1回目の描画処理でない場合には、図11(A)、図11(B)で説明したように、マスクデータと描画データの論理積をとり、マスク画像を生成する(ステップS23)。
【0130】
次にマスクデータとマスク画像が一致しているか否かを判断し(ステップS24)、一致していない場合には、衝突ありとして、衝突判定処理を終了する(ステップS25)。一方、一致した場合には、マスクデータと描画データの排他的論理和をとり、得られたデータと描画データとの論理積をとり、得られたデータを次のマスクデータとして、マスクデータ記憶部60に記憶する(ステップS26)。そして、衝突なしとして、衝突判定を終了する(ステップS27)。
【0131】
なお、上記のように本実施形態について詳細に説明したが、本発明の新規事項および効果から実体的に逸脱しない多くの変形が可能であることは当業者には容易に理解できるであろう。従って、このような変形例はすべて本発明の範囲に含まれるものとする。例えば、明細書又は図面において、少なくとも一度、より広義または同義な異なる用語と共に記載された用語は、明細書又は図面のいかなる箇所においても、その異なる用語に置き換えることができる。また本実施形態及び変形例の全ての組み合わせも、本発明の範囲に含まれる。また衝突検出システム、ロボットシステムの構成・動作や、深度値の更新手法、オブジェクトの描画手法、描画データの設定手法、衝突判定手法等も、本実施形態で説明したものに限定されず、種々の変形実施が可能である。
【符号の説明】
【0132】
OBA〜OBC、OBA1〜OBA4、オブジェクト、
PB、PB1〜PB3 衝突検出対象オブジェクト、
OB、OB1〜OB3 他のオブジェクト、
DP1 第1の深度値、DP2 第2の深度値、
10 処理部、12 オブジェクト空間設定部、14 衝突判定部、
16 マスク画像生成部、18 画像比較部、20 マスクデータ生成部、
30 描画部、32 深度値判定部、34 深度値更新部、36 深度値コピー部、
50 記憶部、52 オブジェクトデータ記憶部、54 描画バッファー、
56 第1の深度バッファー、58 第2の深度バッファー、70 操作部、
80 外部I/F部、90 情報記憶媒体、110 論理積部、
112 排他的論理和部、114 排他的論理和部、116 論理積部、
300 制御装置、310 ロボット、320 アーム、330 ハンド
【特許請求の範囲】
【請求項1】
処理部と、
描画処理を行う描画部と、
深度情報を記憶する第1の深度バッファーと、
深度情報を記憶する第2の深度バッファーと、
を含み、
前記描画部は、
前記第1の深度バッファーを参照して、衝突検出対象オブジェクトと、衝突検出対象オブジェクト以外の他のオブジェクトの描画処理を行い、処理対象ピクセルの深度値が、前記第1の深度バッファーの第1の深度値より所定の視点から見て後方における最前面の深度値である場合に、前記第2の深度バッファーの第2の深度値を前記処理対象ピクセルの深度値に更新し、
前記処理部は、
前記衝突検出対象オブジェクトの描画処理の結果に基づいて、前記衝突検出対象オブジェクトの前記所定の視点から見たときの前面と背面の間に、前記他のオブジェクトが存在すると前記処理部が判断した場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突したと判定することを特徴とする衝突検出システム。
【請求項2】
請求項1において、
前記描画部により描画データが書き込まれる描画バッファーを含み、
前記処理部は、
前記描画バッファーに書き込まれた前記描画データに基づいて、前記衝突検出対象オブジェクトの衝突判定を行うことを特徴とする衝突検出システム。
【請求項3】
請求項2において、
前記描画部は、
前記処理対象ピクセルの深度値が、前記第1の深度バッファーの第1の深度値より前記所定の視点から見て後方における最前面の深度値であり、且つ、前記衝突検出対象オブジェクトの深度値である場合には、前記第2の深度バッファーの第2の深度値を前記処理対象ピクセルの深度値に更新して、前記描画バッファーに前記描画データを書き込み、
前記処理対象ピクセルの深度値が、前記第1の深度バッファーの第1の深度値より前記所定の視点から見て後方における最前面の深度値であり、且つ、前記衝突検出対象オブジェクト以外の前記他のオブジェクトの深度値である場合には、前記描画バッファーに前記描画データを書き込むことなく、前記第2の深度バッファーの第2の深度値を前記処理対象ピクセルの深度値に更新することを特徴とする衝突検出システム。
【請求項4】
請求項2又は3において、
前記処理部は、
第1の描画処理において前記衝突検出対象オブジェクトの前面が描画され、前記第1の描画処理の次の第2の描画処理において前記衝突検出対象オブジェクトの背面が描画されなかったことが、前記描画バッファーの前記描画データに基づき検出された場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突したと判定することを特徴とする衝突検出システム。
【請求項5】
請求項4において、
前記第1の描画処理において前記衝突検出対象オブジェクトの前面が描画された場合に第1の論理レベルになるマスクデータが生成され、
前記処理部は、
前記第1の描画処理で生成された前記マスクデータが前記第1の論理レベルであり、前記第2の描画処理において前記衝突検出対象オブジェクトの背面が描画されなかったことが前記描画バッファーの前記描画データに基づき検出された場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突したと判定することを特徴とする衝突検出システム。
【請求項6】
請求項2において、
前記描画部は、
前記衝突検出対象オブジェクトの前面を描画する場合には、前記描画データとして第1のデータを前記描画バッファーに書き込み、前記衝突検出対象オブジェクトの背面を描画する場合には、前記描画データとして前記第1のデータとは異なる第2のデータを前記描画バッファーに書き込み、
前記処理部は、
第1の描画処理において前記第1のデータが前記描画バッファーに書き込まれ、前記第1の描画処理の次の第2の描画処理において、前記第2のデータが前記描画バッファーに書き込まれなかった場合に、前記衝突検出対象オブジェクトについての衝突が発生したと判定することを特徴とする衝突検出システム。
【請求項7】
請求項1乃至6のいずれかにおいて、
前記処理部は、
前記衝突検出対象オブジェクトの描画処理の結果に基づいて、前記衝突検出対象オブジェクトの前面の次に前記衝突検出対象オブジェクトの背面が描画されたと判断した場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突しなかったと判定することを特徴とする衝突検出システム。
【請求項8】
請求項1乃至7のいずれかにおいて、
1画面分の描画処理が終了した後に、前記第2の深度バッファーの第2の深度値が前記第1の深度バッファーに書き込まれることを特徴とする衝突検出システム。
【請求項9】
請求項1乃至8のいずれかにおいて、
前記描画部は、
無限遠の前記視点での平行投影で描画処理を行うことを特徴とする衝突検出システム。
【請求項10】
請求項1乃至9のいずれかにおいて、
前記衝突検出対象オブジェクトは、ロボットをモデル化したオブジェクトであることを特徴とする衝突検出システム。
【請求項11】
請求項1乃至10のいずれかに記載の衝突検出システムを含むことを特徴とするロボットシステム。
【請求項12】
第1の深度バッファーを参照して、衝突検出対象オブジェクトと、衝突検出対象オブジェクト以外の他のオブジェクトの描画処理を行い、
処理対象ピクセルの深度値が、前記第1の深度バッファーの第1の深度値より所定の視点から見て後方における最前面の深度値である場合に、第2の深度バッファーの第2の深度値を前記処理対象ピクセルの深度値に更新し、
前記衝突検出対象オブジェクトの描画処理の結果に基づいて、前記衝突検出対象オブジェクトの前記所定の視点から見たときの前面と背面の間に、前記他のオブジェクトが存在するか否かを判断し、
前記衝突検出対象オブジェクトの前記所定の視点から見たときの前面と背面の間に、前記他のオブジェクトが存在すると判断された場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突したと判定することを特徴とする衝突検出方法。
【請求項13】
処理部と、
描画処理を行う描画部と、
深度情報を記憶する第1の深度バッファーと、
深度情報を記憶する第2の深度バッファーとして、
コンピューターを機能させ、
前記描画部は、
前記第1の深度バッファーを参照して、衝突検出対象オブジェクトと、衝突検出対象オブジェクト以外の他のオブジェクトの描画処理を行い、処理対象ピクセルの深度値が、前記第1の深度バッファーの第1の深度値より所定の視点から見て後方における最前面の深度値である場合に、前記第2の深度バッファーの第2の深度値を前記処理対象ピクセルの深度値に更新し、
前記処理部は、
前記衝突検出対象オブジェクトの描画処理の結果に基づいて、前記衝突検出対象オブジェクトの前記所定の視点から見たときの前面と背面の間に、前記他のオブジェクトが存在すると判断した場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突したと判定することを特徴とするプログラム。
【請求項1】
処理部と、
描画処理を行う描画部と、
深度情報を記憶する第1の深度バッファーと、
深度情報を記憶する第2の深度バッファーと、
を含み、
前記描画部は、
前記第1の深度バッファーを参照して、衝突検出対象オブジェクトと、衝突検出対象オブジェクト以外の他のオブジェクトの描画処理を行い、処理対象ピクセルの深度値が、前記第1の深度バッファーの第1の深度値より所定の視点から見て後方における最前面の深度値である場合に、前記第2の深度バッファーの第2の深度値を前記処理対象ピクセルの深度値に更新し、
前記処理部は、
前記衝突検出対象オブジェクトの描画処理の結果に基づいて、前記衝突検出対象オブジェクトの前記所定の視点から見たときの前面と背面の間に、前記他のオブジェクトが存在すると前記処理部が判断した場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突したと判定することを特徴とする衝突検出システム。
【請求項2】
請求項1において、
前記描画部により描画データが書き込まれる描画バッファーを含み、
前記処理部は、
前記描画バッファーに書き込まれた前記描画データに基づいて、前記衝突検出対象オブジェクトの衝突判定を行うことを特徴とする衝突検出システム。
【請求項3】
請求項2において、
前記描画部は、
前記処理対象ピクセルの深度値が、前記第1の深度バッファーの第1の深度値より前記所定の視点から見て後方における最前面の深度値であり、且つ、前記衝突検出対象オブジェクトの深度値である場合には、前記第2の深度バッファーの第2の深度値を前記処理対象ピクセルの深度値に更新して、前記描画バッファーに前記描画データを書き込み、
前記処理対象ピクセルの深度値が、前記第1の深度バッファーの第1の深度値より前記所定の視点から見て後方における最前面の深度値であり、且つ、前記衝突検出対象オブジェクト以外の前記他のオブジェクトの深度値である場合には、前記描画バッファーに前記描画データを書き込むことなく、前記第2の深度バッファーの第2の深度値を前記処理対象ピクセルの深度値に更新することを特徴とする衝突検出システム。
【請求項4】
請求項2又は3において、
前記処理部は、
第1の描画処理において前記衝突検出対象オブジェクトの前面が描画され、前記第1の描画処理の次の第2の描画処理において前記衝突検出対象オブジェクトの背面が描画されなかったことが、前記描画バッファーの前記描画データに基づき検出された場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突したと判定することを特徴とする衝突検出システム。
【請求項5】
請求項4において、
前記第1の描画処理において前記衝突検出対象オブジェクトの前面が描画された場合に第1の論理レベルになるマスクデータが生成され、
前記処理部は、
前記第1の描画処理で生成された前記マスクデータが前記第1の論理レベルであり、前記第2の描画処理において前記衝突検出対象オブジェクトの背面が描画されなかったことが前記描画バッファーの前記描画データに基づき検出された場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突したと判定することを特徴とする衝突検出システム。
【請求項6】
請求項2において、
前記描画部は、
前記衝突検出対象オブジェクトの前面を描画する場合には、前記描画データとして第1のデータを前記描画バッファーに書き込み、前記衝突検出対象オブジェクトの背面を描画する場合には、前記描画データとして前記第1のデータとは異なる第2のデータを前記描画バッファーに書き込み、
前記処理部は、
第1の描画処理において前記第1のデータが前記描画バッファーに書き込まれ、前記第1の描画処理の次の第2の描画処理において、前記第2のデータが前記描画バッファーに書き込まれなかった場合に、前記衝突検出対象オブジェクトについての衝突が発生したと判定することを特徴とする衝突検出システム。
【請求項7】
請求項1乃至6のいずれかにおいて、
前記処理部は、
前記衝突検出対象オブジェクトの描画処理の結果に基づいて、前記衝突検出対象オブジェクトの前面の次に前記衝突検出対象オブジェクトの背面が描画されたと判断した場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突しなかったと判定することを特徴とする衝突検出システム。
【請求項8】
請求項1乃至7のいずれかにおいて、
1画面分の描画処理が終了した後に、前記第2の深度バッファーの第2の深度値が前記第1の深度バッファーに書き込まれることを特徴とする衝突検出システム。
【請求項9】
請求項1乃至8のいずれかにおいて、
前記描画部は、
無限遠の前記視点での平行投影で描画処理を行うことを特徴とする衝突検出システム。
【請求項10】
請求項1乃至9のいずれかにおいて、
前記衝突検出対象オブジェクトは、ロボットをモデル化したオブジェクトであることを特徴とする衝突検出システム。
【請求項11】
請求項1乃至10のいずれかに記載の衝突検出システムを含むことを特徴とするロボットシステム。
【請求項12】
第1の深度バッファーを参照して、衝突検出対象オブジェクトと、衝突検出対象オブジェクト以外の他のオブジェクトの描画処理を行い、
処理対象ピクセルの深度値が、前記第1の深度バッファーの第1の深度値より所定の視点から見て後方における最前面の深度値である場合に、第2の深度バッファーの第2の深度値を前記処理対象ピクセルの深度値に更新し、
前記衝突検出対象オブジェクトの描画処理の結果に基づいて、前記衝突検出対象オブジェクトの前記所定の視点から見たときの前面と背面の間に、前記他のオブジェクトが存在するか否かを判断し、
前記衝突検出対象オブジェクトの前記所定の視点から見たときの前面と背面の間に、前記他のオブジェクトが存在すると判断された場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突したと判定することを特徴とする衝突検出方法。
【請求項13】
処理部と、
描画処理を行う描画部と、
深度情報を記憶する第1の深度バッファーと、
深度情報を記憶する第2の深度バッファーとして、
コンピューターを機能させ、
前記描画部は、
前記第1の深度バッファーを参照して、衝突検出対象オブジェクトと、衝突検出対象オブジェクト以外の他のオブジェクトの描画処理を行い、処理対象ピクセルの深度値が、前記第1の深度バッファーの第1の深度値より所定の視点から見て後方における最前面の深度値である場合に、前記第2の深度バッファーの第2の深度値を前記処理対象ピクセルの深度値に更新し、
前記処理部は、
前記衝突検出対象オブジェクトの描画処理の結果に基づいて、前記衝突検出対象オブジェクトの前記所定の視点から見たときの前面と背面の間に、前記他のオブジェクトが存在すると判断した場合に、前記衝突検出対象オブジェクトが前記他のオブジェクトに衝突したと判定することを特徴とするプログラム。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【公開番号】特開2012−226637(P2012−226637A)
【公開日】平成24年11月15日(2012.11.15)
【国際特許分類】
【出願番号】特願2011−94820(P2011−94820)
【出願日】平成23年4月21日(2011.4.21)
【出願人】(000002369)セイコーエプソン株式会社 (51,324)
【Fターム(参考)】
【公開日】平成24年11月15日(2012.11.15)
【国際特許分類】
【出願日】平成23年4月21日(2011.4.21)
【出願人】(000002369)セイコーエプソン株式会社 (51,324)
【Fターム(参考)】
[ Back to top ]