(57)【要約】  【課題】ロボットの動作中に発生したエラーから簡単にリカバーできるようにする。  【解決手段】ユーザー命令を取得する第一のステップと、ロボットの状態及び前記ロボットの周囲の環境の状態を検出する第二のステップと、前記検出した状態に基づいて前記取得したユーザー命令を実現可能な前記ロボットの動作命令の組み合わせであるシナリオを生成する第三のステップと、前記生成したシナリオに従って前記ロボットを動作させる第四のステップと、前記ロボットの作業が正常に実行されたか否かを判定する第五のステップと、前記ロボットの作業が正常に実行されなかったと判定された場合に、前記第二のステップに戻る第六のステップと、を含む。【選択図】図１
2014124735.tif 000002
【特許請求の範囲】
【請求項１】
ユーザーから教示されたロボットの作業に関するユーザー命令を取得する第一のステップと、
前記ロボットの状態及び前記ロボットの周囲の環境の状態を検出する第二のステップと、
前記第二のステップで検出した状態に基づいて、予め用意されている前記ロボットの動作命令群の中から前記第一のステップで取得したユーザー命令を実現可能な前記ロボットの動作命令の組み合わせであるシナリオを生成する第三のステップと、
前記第三のステップで生成したシナリオに従って前記ロボットを動作させる第四のステップと、
前記第四のステップの結果、前記ロボットの作業が正常に実行されたか否かを判定する第五のステップと、
前記第五のステップで前記ロボットの作業が正常に実行されなかったと判定された場合に、前記第二のステップに戻る第六のステップと、を含む、
ことを特徴とするロボット制御方法。
【請求項２】
請求項１に記載のロボット制御方法であって、
前記第三のステップでは、前記生成したシナリオのシミュレーションを実行し、
前記第五のステップでは、前記第四のステップの終了後の前記ロボットの状態及び前記ロボットの周囲の環境の状態を検出し、当該検出した状態と、前記第三のステップでの前記シミュレーションの結果とに基づいて、前記ロボットの作業が正常に実行されたか否かを判定する、
ことを特徴とするロボット制御方法。
【請求項３】
請求項２に記載のロボット制御方法であって、
前記第三のステップでは、前記生成したシナリオごとに、前記シミュレーションを実行し、当該シナリオによる前記ロボットの動作量、及び当該シナリオによる前記ロボットの動作時間のいずれかに基づいて優先度を設定し、前記優先度が最も高いシナリオを前記第四のステップで使用するシナリオとして選択する、
ことを特徴とするロボット制御方法。
【請求項４】
請求項２に記載のロボット制御方法であって、
前記第四のステップで実行されたシナリオごとに、前記第五のステップの判定の結果に基づいて当該シナリオの成功率を記録する第七のステップを含み、
前記第三のステップでは、生成したシナリオごとに、前記第七のステップで記録されている成功率に基づいて優先度を設定し、前記優先度が最も高いシナリオを前記第四のステップで使用するシナリオとして選択する、
ことを特徴とするロボット制御方法。
【請求項５】
請求項３又は４に記載のロボット制御方法であって、
前記ロボットは複数の可動部を備え、
前記第三のステップでは、前記可動部ごとに、前記ユーザー命令を実現可能なシナリオを生成する、
ことを特徴とするロボット制御方法。
【請求項６】
ユーザーから教示されたロボットの作業に関するユーザー命令を取得する取得部と、
前記ロボットの状態及び前記ロボットの周囲の環境の状態を検出する検出部と、
前記検出部により検出した状態に基づいて、予め用意されている前記ロボットの動作命令群の中から前記取得部により取得したユーザー命令を実現可能な前記ロボットの動作命令の組み合わせであるシナリオを生成する生成部と、
前記生成部により生成したシナリオに従って前記ロボットを動作させる再生部と、
前記ロボットの作業が正常に実行されたか否かを判定する判定部と、を有し、
前記判定部により前記ロボットの作業が正常に実行されたと判定されるまで、前記検出部、前記生成部、前記再生部、及び前記判定部による処理を繰り返す、
ことを特徴とするロボット制御装置。
【請求項７】
ユーザーから教示されたロボットの作業に関するユーザー命令を取得する第一のステップと、
前記ロボットの状態及び前記ロボットの周囲の環境の状態を検出する第二のステップと、
前記第二のステップで検出した状態に基づいて、予め用意されている前記ロボットの動作命令群の中から前記第一のステップで取得したユーザー命令を実現可能な前記ロボットの動作命令の組み合わせであるシナリオを生成する第三のステップと、
前記第三のステップで生成したシナリオに従って前記ロボットを動作させる第四のステップと、
前記第四のステップの結果、前記ロボットの作業が正常に実行されたか否かを判定する第五のステップと、
前記第五のステップで前記ロボットの作業が正常に実行されなかったと判定された場合に、前記第二のステップに戻る第六のステップと、をコンピューターに実行させる、
ことを特徴とするプログラム。
【請求項８】
ロボットであって、
ユーザーから教示された前記ロボットの作業に関するユーザー命令を取得する取得部と、
前記ロボットの状態及び前記ロボットの周囲の環境の状態を検出する検出部と、
前記検出部により検出した状態に基づいて、予め用意されている前記ロボットの動作命令群の中から前記取得部により取得したユーザー命令を実現可能な前記ロボットの動作命令の組み合わせであるシナリオを生成する生成部と、
前記生成部により生成したシナリオに従って前記ロボットを動作させる再生部と、
前記ロボットの作業が正常に実行されたか否かを判定する判定部と、を有し、
前記判定部により前記ロボットの作業が正常に実行された判定されるまで、前記検出部、前記生成部、前記再生部、及び前記判定部による処理を繰り返す、
ことを特徴とするロボット。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ロボット制御方法、ロボット制御装置、プログラム、及びロボットに関する。
【背景技術】
【０００２】
特許文献１には、作業をティーチング後プレイバックする前に、多関節ロボットの手先を目的位置に到達させるための手先運動の解を複数演算するとともに、各解に優先順位を付け、プレイバックするときに動作不可能とならない解を優先順位の高い順にチェックすることが記載されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開昭６４−６１８０４
【発明の概要】
【発明が解決しようとする課題】
【０００４】
特許文献１の技術は、ロボットの関節が動作許容範囲を超えるなどのエラーを、プレイバックの事前に回避することができる。しかし、プレイバック前に想定できないエラー（例えば、プレイバック中に現れた障害物にロボットが衝突する、プレイバック中にロボットのハンドで把持されたワークが落ちるなど）が発生した場合、当該エラーからリカバーする（例えば、作業開始前の状態に戻さずに、エラーの状態から作業を再開して完了させる）ことについては触れられていない。
【０００５】
本発明は、ロボットの動作中に発生したエラーから簡単にリカバーできるようにすることを目的とする。
【課題を解決するための手段】
【０００６】
上記の課題を解決するための本発明の第一の態様は、ユーザーから教示されたロボットの作業に関するユーザー命令を取得する第一のステップと、前記ロボットの状態及び前記ロボットの周囲の環境の状態を検出する第二のステップと、前記第二のステップで検出した状態に基づいて、予め用意されている前記ロボットの動作命令群の中から前記第一のステップで取得したユーザー命令を実現可能な前記ロボットの動作命令の組み合わせであるシナリオを生成する第三のステップと、前記第三のステップで生成したシナリオに従って前記ロボットを動作させる第四のステップと、前記第四のステップの結果、前記ロボットの作業が正常に実行されたか否かを判定する第五のステップと、前記第五のステップで前記ロボットの作業が正常に実行されなかったと判定された場合に、前記第二のステップに戻る第六のステップと、を含む、ことを特徴とするロボット制御方法である。このような構成によれば、シナリオの実行によりエラーが発生した場合でも、ユーザー命令を再入力することなく、現在の状態に基づいて代替的なシナリオが再生成されて実行されるため、エラーから簡単にリカバーすることができる。
【０００７】
前記ロボット制御方法であって、前記第三のステップでは、前記生成したシナリオのシミュレーションを実行し、前記第五のステップでは、前記第四のステップの終了後の前記ロボットの状態及び前記ロボットの周囲の環境の状態を検出し、当該検出した状態と、前記第三のステップでの前記シミュレーションの結果とに基づいて、前記ロボットの作業が正常に実行されたか否かを判定する、ことを特徴としていてもよい。このような構成によれば、ロボットの故障などの内部的なエラーだけでなく、新たに障害物が発生した、ワークの位置が目的位置からずれているなどの外部的なエラーも検出して、ユーザー命令に基づく作業のエラーを精度よく検出することができる。
【０００８】
前記ロボット制御方法であって、前記第三のステップでは、前記生成したシナリオごとに、前記シミュレーションを実行し、当該シナリオによる前記ロボットの動作量、及び当該シナリオによる前記ロボットの動作時間のいずれかに基づいて優先度を設定し、前記優先度が最も高いシナリオを前記第四のステップで使用するシナリオとして選択する、ことを特徴としていてもよい。このような構成により、各シナリオの動作量などに基づく優先度に基づいてシナリオが選択されて再生されるため、シナリオ再生の成功率を高めることができる。
【０００９】
前記ロボット制御方法であって、前記第四のステップで実行されたシナリオごとに、前記第五のステップの判定の結果に基づいて当該シナリオの成功率を記録する第七のステップを含み、前記第三のステップでは、生成したシナリオごとに、前記第七のステップで記録されている成功率に基づいて優先度を設定し、前記優先度が最も高いシナリオを前記第四のステップで使用するシナリオとして選択する、ことを特徴としていてもよい。このような構成により、各シナリオの過去の成功率に基づく優先度に基づいてシナリオが選択されて再生されるため、シナリオ再生の成功率を高めることができる。
【００１０】
前記のロボット制御方法であって、前記ロボットは複数の可動部を備え、前記第三のステップでは、前記可動部ごとに、前記ユーザー命令を実現可能なシナリオを生成する、ことを特徴としていてもよい。このような構成により、一つのユーザー命令に対して様々なパターンのシナリオが生成されるため、成功率の高いシナリオを選択することができる。
【００１１】
上記の課題を解決するための本発明の第二の態様は、ユーザーから教示されたロボットの作業に関するユーザー命令を取得する取得部と、前記ロボットの状態及び前記ロボットの周囲の環境の状態を検出する検出部と、前記検出部により検出した状態に基づいて、予め用意されている前記ロボットの動作命令群の中から前記取得部により取得したユーザー命令を実現可能な前記ロボットの動作命令の組み合わせであるシナリオを生成する生成部と、前記生成部により生成したシナリオに従って前記ロボットを動作させる再生部と、前記ロボットの作業が正常に実行されたか否かを判定する判定部と、を有し、前記判定部により前記ロボットの作業が正常に実行されたと判定されるまで、前記検出部、前記生成部、前記再生部、及び前記判定部による処理を繰り返す、ことを特徴とするロボット制御装置である。このような構成によれば、シナリオの実行によりエラーが発生した場合でも、ユーザー命令を再入力することなく、現在の状態（エラーの発生した状態）に基づいて代替的なシナリオが再生成されて実行されるため、エラーから簡単にリカバーすることができる。
【００１２】
上記の課題を解決するための本発明の第三の態様は、ユーザーから教示されたロボットの作業に関するユーザー命令を取得する第一のステップと、前記ロボットの状態及び前記ロボットの周囲の環境の状態を検出する第二のステップと、前記第二のステップで検出した状態に基づいて、予め用意されている前記ロボットの動作命令群の中から前記第一のステップで取得したユーザー命令を実現可能な前記ロボットの動作命令の組み合わせであるシナリオを生成する第三のステップと、前記第三のステップで生成したシナリオに従って前記ロボットを動作させる第四のステップと、前記第四のステップの結果、前記ロボットの作業が正常に実行されたか否かを判定する第五のステップと、前記第五のステップで前記ロボットの作業が正常に実行されなかったと判定された場合に、前記第二のステップに戻る第六のステップと、をコンピューターに実行させる、ことを特徴とするプログラムである。このような構成によれば、シナリオの実行によりエラーが発生した場合でも、ユーザー命令を再入力することなく、現在の状態（エラーの発生した状態）に基づいて代替的なシナリオが再生成されて実行されるため、エラーから簡単にリカバーすることができる。
【００１３】
上記の課題を解決するための本発明の第四の態様は、ロボットであって、ユーザーから教示された前記ロボットの作業に関するユーザー命令を取得する取得部と、前記ロボットの状態及び前記ロボットの周囲の環境の状態を検出する検出部と、前記検出部により検出した状態に基づいて、予め用意されている前記ロボットの動作命令群の中から前記取得部により取得したユーザー命令を実現可能な前記ロボットの動作命令の組み合わせであるシナリオを生成する生成部と、前記生成部により生成したシナリオに従って前記ロボットを動作させる再生部と、前記ロボットの作業が正常に実行されたか否かを判定する判定部と、を有し、前記判定部により前記ロボットの作業が正常に実行された判定されるまで、前記検出部、前記生成部、前記再生部、及び前記判定部による処理を繰り返す、ことを特徴とする。このような構成によれば、シナリオの実行によりエラーが発生した場合でも、ユーザー命令を再入力することなく、現在の状態（エラーの発生した状態）に基づいて代替的なシナリオが再生成されて実行されるため、エラーから簡単にリカバーすることができる。
【図面の簡単な説明】
【００１４】
【図１】本発明の一実施形態に係るロボットシステム１の概略構成の一例を示す図である。
【図２】シナリオ再生装置１０の機能構成の一例を示す図である。
【図３】ライブラリーテーブル１１１の構成の一例を示す図である。
【図４】シナリオテーブル１１２の構成の一例を示す図である。
【図５】コンピューター６０の概略構成の一例を示す図である。
【図６】シナリオ再生処理の一例を示すフロー図である。
【図７】シナリオ生成処理の一例を示すフロー図である。
【図８】エラーチェック処理の一例を示すフロー図である。
【図９】エラー発生前のシナリオ（一方のアームを使用する場合）の一例を説明する図である。
【図１０】エラー発生前のシナリオ（両方のアームを使用する場合）の一例を説明する図である。
【図１１】エラー発生前のシナリオ（他方のアームを使用する場合）の一例を説明する図である。
【図１２】エラー発生後のシナリオ（一方のアームを使用する場合）の一例を説明する図である。
【図１３】エラー発生後のシナリオ（両方のアームを使用する場合）の一例を説明する図である。
【図１４】エラー発生後のシナリオ（他方のアームを使用する場合）の一例を説明する図である。
【発明を実施するための形態】
【００１５】
＜第一実施形態＞
本発明の第一実施形態について、図面を参照して説明する。
【００１６】
図１は、本実施形態に係るロボットシステム１の構成の一例を示す図である。ロボットシステム１は、シナリオ再生装置１０と、ロボット制御装置２０と、ロボット３０と、撮影装置４０とを備える。
【００１７】
ロボットシステム１では、ユーザーによりシナリオ再生装置１０に対して作業内容が教示されると、シナリオ再生装置１０は、当該作業内容を実現する動作命令群を生成して、ロボット制御装置２０に出力する。ロボット制御装置２０は、シナリオ再生装置１０から出力された動作命令群に基づいてロボット３０を駆動することで、ユーザーから教示された作業内容を実行する。
【００１８】
本実施形態では、ユーザーにより教示される作業内容を、「ユーザー命令」と呼ぶ。ユーザー命令は、例えば、「ワークＷを目的位置Ｄに置く」といった大まかな内容とすることができる。
【００１９】
また、本実施形態では、ユーザー命令に基づいて生成される動作命令群を、「シナリオ」と呼ぶ。シナリオは、ロボット制御装置２０で解釈可能な動作命令群から構成される。シナリオは、ユーザー命令を実現するために必要なロボットの動作単位で構成されるものであり、例えば、ユーザー命令が「ワークＷを目的位置Ｄに置く」である場合、動作命令群は、「ワークＷに（ワークＷの位置に）手先を移動する」、「ワークＷを把持する」、「位置Ｄに手先を移動する」「ワークＷを解放する」などとすることができる。もちろん、一つのユーザー命令に対して、シナリオが複数生成されてもよい。
【００２０】
また、本実施形態では、シナリオに基づいてロボット制御装置２０により生成されるロボット３０で解釈可能な命令を、「制御命令」と呼ぶ。
【００２１】
シナリオ再生装置１０は、ユーザー命令を取得する。また、ロボット制御装置２０から、ロボット３０の現在の状態（例えば、ジョイントの角度、手先の位置、力覚センサーなどのセンサーの出力値など）を特定する情報や、ロボット３０の周囲の環境の現在の状態（例えば、ワークＷの位置及びワークＷが空間を占める領域、障害物の位置及び障害物が空間を占める領域など）を特定する情報を取得する。また、ユーザー命令と現在の状態を特定する情報とに基づいて、ユーザー命令を実現するシナリオを生成し、ロボット制御装置２０に出力する。シナリオ再生装置１０の詳細は後述する。
【００２２】
ロボット制御装置２０は、ロボット３０の動作を制御する。ロボット制御装置２０は、ロボット３０が備えるセンサーやエンコーダーなどの情報、撮影装置４０の画像情報などに基づいて、ロボット３０の現在の状態を検出する。また、撮影装置４０の画像情報に基づいて、ロボット３０の周囲の環境の現在の状態を検出する。また、ロボット制御装置２０は、シナリオ再生装置１０から動作命令群を受信し、受信した動作命令群と、検出した現在の状態とに基づいてロボット３０を駆動する制御命令を生成し、ロボット３０に出力する。また、ロボット制御装置２０は、検出したロボット３０の現在の状態を特定する情報、検出したロボット３０の周囲の環境の現在の状態を特定する情報を、シナリオ再生装置１０に出力する。
【００２３】
例えば、動作命令が「ワークＷに（ワークＷの位置に）手先を移動する」である場合、ロボット制御装置２０は、検出した現在の状態を特定する情報に基づいて、ワークＷの位置及びロボットの手先の位置を認識し、手先をワークＷ付近に移動する制御命令を生成する。ロボット制御装置２０の処理は、公知の技術により実現できるので、詳細な説明は省略する。
【００２４】
ロボット３０は、ロボット制御装置２０からの制御命令に従って動作し、例えば、ワークＷの組み立て、ワークＷの移動、などの作業を行う。そのため、ロボット３０は、２本のアーム部３１（３１Ａ、３１Ｂ）を備える。アーム部３１は、リンク３２と、ジョイント３３とを含む。ロボット３０は、アーム部３１の先端部に、ワークＷなどの対象物を把持したり、道具を把持して対象物に対して所定の作業を行ったりすることが可能なハンド３６を備える。ロボット３０は、ロボット制御装置２０から与えられる制御命令に従って、各ジョイント３３を連動させて駆動することにより、アーム部３１の先端部の位置を、所定の可動範囲内で、自在に移動させたり、自由な方向へ向けたりすることができる。なお、アーム部３１その他のロボット３０の動作するパーツを、可動部と呼んでもよい。
【００２５】
上記のロボット３０の構成は、上記の構成に限られない。また、一般的なロボットが備える構成を排除するものではない。例えば、ジョイントの数（「軸数」ともいう）やリンクの数を増減させてもよい。また、ジョイント、リンク、ハンド等の各種部材の形状、大きさ、配置、構造等も適宜変更してよい。
【００２６】
撮影装置４０は、ワークＷなどを含む作業空間を撮影し、画像データを生成し、ロボット制御装置２０に出力する。撮影装置４０は、例えば、カメラであり、作業台、天井、床、壁などに設置される。
【００２７】
上記のロボットシステム１の構成は、本実施形態の特徴を説明するにあたって主要構成を説明したのであって、一般的なロボットシステムが備える構成を排除するものではない。例えば、シナリオ再生装置１０、ロボット制御装置２０、及びロボット３０は、いずれか二つ以上が一体の装置となっていてもよい。また、撮影装置４０の数や設置場所は、作業空間の撮影ができれば、特に限定されず、例えば、ロボット制御装置２０やロボット３０に設けられていてもよい。
【００２８】
なお、シナリオ再生装置１０がロボット制御装置２０と一体の装置であるか否かに係わらず、シナリオ再生装置１０をロボット制御装置と呼んでもよい。
【００２９】
図２は、シナリオ再生装置１０の機能構成の一例を示す図である。シナリオ再生装置１０は、制御部１００と、記憶部１１０と、入力部１２０と、表示部１３０と、通信部１４０と、を有する。
【００３０】
入力部１２０は、ユーザー命令などのユーザーの入力操作を受け付ける。
【００３１】
表示部１３０は、ユーザーインターフェイス（以下、「ＵＩ」とも呼ぶ。）画面などを表示する。
【００３２】
通信部１４０は、ネットワークやケーブルを介してロボット制御装置２０と情報の送受信を行う。
【００３３】
記憶部１１０には、シナリオ再生装置１０の制御に必要な情報などが格納される。
【００３４】
本実施形態では、ユーザー命令から簡単に動作命令群であるシナリオを生成できるように、ライブラリー（以下、「ライブラリー命令」ともいう。）が用意されている。ライブラリー命令は、ユーザー命令に対応するものが予め用意されているものとする。また、ライブラリー命令は、複数の動作命令群で構成されている。ユーザー命令に対応するライブラリー命令を選択するとともに、当該ライブラリー命令に必要な設定値を設定することで、当該ライブラリー命令を構成する動作命令群に基づくシナリオが生成される。そのため、記憶部１１０には、ライブラリーテーブル１１１と、シナリオテーブル１１２とが格納される。
【００３５】
ライブラリーテーブル１１１には、ライブラリー命令が格納される。具体的には、図３（ライブラリーテーブル１１１の構成の一例を示す図）に示すように、ライブラリーテーブル１１１には、ライブラリー命令ごとに、レコードが格納される。レコードは、当該ライブラリー命令の識別情報であるライブラリー命令ＩＤ１１１ａと、当該ライブラリー命令１１１ｂと、当該ライブラリー命令を構成する動作命令群１１１ｃとが関連付けられて構成される。本実施形態では、様々なユーザー命令をロボット３０が実行できるように、各種のライブラリー命令のレコードが予め格納されている。
【００３６】
例えば、ライブラリー命令「MoveFromTo(w, d, arm0)」について説明する。変数ｗには、移動対象となるワークを特定する情報が設定される。変数ｄには、目的位置を特定する情報が設定される。変数ａｒｍ０には、動作対象となるアームを特定する情報が設定される。すなわち、ライブラリー「MoveFromTo(w, d, arm0)」は、変数ｗに設定されたワークを、変数ｄに設定された目的位置に、変数ａｒｍ０に設定されたアームを使って移動する、というライブラリー命令である。また、当該ライブラリー命令は、下記の動作命令群で構成される。
【００３７】
動作命令「arm0: Move to w」は、変数ａｒｍ０に設定されたアームのハンドの位置を、変数ｗに設定されたワークの位置まで移動する、という動作命令である。
動作命令「arm0: Grasp w」は、変数ａｒｍ０に設定されたアームのハンドで、変数ｗに設定されたワークを把持する、という動作命令である。
動作命令「arm0: Move to d」は、変数ａｒｍ０に設定されたアームのハンドの位置を、変数ｄに設定された目的位置まで移動する、という動作命令である。
動作命令「arm0: Release w」は、変数ａｒｍ０に設定されたアームのハンドで把持された、変数ｗに設定されたワークを解放する、という動作命令である。
【００３８】
また、例えば、ライブラリー命令「MoveFromTo(w, d, arm0, arm1)」について説明する。変数ｗには、移動対象となるワークを特定する情報が設定される。変数ｄには、目的位置を特定する情報が設定される。変数ａｒｍ０及び変数ａｒｍ１には、動作対象となるアームを特定する情報が設定される。すなわち、ライブラリー命令「MoveFromTo(w, d, arm0, arm1)」は、変数ｗに設定されたワークを、変数ｄに設定された目的位置に、変数ａｒｍ０に設定されたアームと変数ａｒｍ１に設定されたアームとを使って移動する、というライブラリー命令である。また、当該ライブラリー命令は、下記の動作命令群で構成される。
【００３９】
動作命令「arm0: Move to w」は、変数ａｒｍ０に設定されたアームのハンドの位置を、変数ｗに設定されたワークの位置まで移動する、という動作命令である。
動作命令「arm0: Grasp w」は、変数ａｒｍ０に設定されたアームのハンドで、変数ｗに設定されたワークを把持する、という動作命令である。
動作命令「arm0: Move to R」は、変数ａｒｍ０に設定されたアームのハンドの位置を、所定の中継位置Ｒまで移動する、という動作命令である。
動作命令「arm1: Move to R」は、変数ａｒｍ１に設定されたアームのハンドの位置を、所定の中継位置Ｒまで移動する、という動作命令である。
動作命令「arm1: Grasp w」は、変数ａｒｍ１に設定されたアームのハンドで、変数ｗに設定されたワークを把持する、という動作命令である。
動作命令「arm0: Release w」は、変数ａｒｍ０に設定されたアームのハンドで把持された、変数ｗに設定されたワークを解放する、という動作命令である。
動作命令「arm1: Move to d」は、変数ａｒｍ１に設定されたアームのハンドの位置を、変数ｄに設定された目的位置まで移動する、という動作命令である。
動作命令「arm1: Release w」は、変数ａｒｍ１に設定されたアームのハンドで把持された、変数ｗに設定されたワークを解放する、という動作命令である。
【００４０】
なお、ライブラリー命令、ライブラリー命令を構成する動作命令群は、上述した例に限られるものではない。
【００４１】
シナリオテーブル１１２には、ライブラリー命令を用いて生成されたシナリオが格納される。シナリオテーブル１１２は、ユーザー命令ごとに生成されて、記憶部１１０に格納される。具体的には、図４（シナリオテーブル１１２の構成の一例を示す図）に示すように、シナリオテーブル１１２には、シナリオごとに、レコードが格納される。レコードは、当該シナリオの識別情報であるシナリオＩＤ１１２ａと、当該シナリオを生成するために用いたライブラリー命令のライブラリー命令ＩＤ１１２ｂと、当該シナリオを生成するために用いたライブラリー命令の変数に設定した設定値１１２ｃと、ライブラリー命令の変数に設定された設定値を当該ライブラリー命令の動作命令群１１１ｃに設定することで生成された動作命令群１１２ｄと、当該シナリオの再生をシミュレーションした結果（例えば、シミュレーション後のロボット３０の状態を特定する情報、シミュレーション後のロボット３０の周囲の環境の状態を特定する情報など）を特定する情報１１２ｅと、当該シナリオの再生の優先度１１２ｆと、が関連付けられて構成される。
【００４２】
図２に戻って説明する。制御部１００は、シナリオ再生装置１０を統合的に制御する。制御部１００は、ユーザー命令取得部（「取得部」とも呼ぶ。）１０１と、状態検出部（単に「検出部」とも呼ぶ。）１０２と、シナリオ生成部（「生成部」とも呼ぶ。）１０３と、シミュレーション部１０４と、シナリオ再生部（「再生部」とも呼ぶ）１０５と、エラーチェック部（「判定部」とも呼ぶ。）１０６とを有する。
【００４３】
ユーザー命令取得部１０１は、入力部１２０を介してユーザーにより入力されたユーザー命令を取得し、シナリオ生成部１０３に出力する。なお、ユーザー命令取得部１０１は、入力されたユーザー命令を解析し、ライブラリー命令に対応する単位の複数のユーザー命令に分けて、シナリオ生成部１０３に出力するようにしてもよい。
【００４４】
状態検出部１０２は、通信部１４０を介してロボット制御装置２０から、ロボット３０の現在の状態を特定する情報と、ロボット３０の周囲の環境の現在の状態を特定する情報とを取得することで、ロボット３０の現在の状態と、ロボット３０の周囲の環境の現在の状態を検出する。
【００４５】
シナリオ生成部１０３は、ユーザー命令取得部１０１で取得されたユーザー命令を実現するシナリオを生成する。すなわち、シナリオ生成部１０３は、ライブラリーテーブル１１１から、ユーザー命令に対応するライブラリー命令を選択するとともに、ライブラリー命令に設定する設定値の様々な組み合わせパターンを決定する。また、各パターンの設定値をライブラリー命令に設定して、各パターンに対応する動作命令群（シナリオ）を生成する。
【００４６】
また、シナリオ生成部１０３は、生成した各シナリオについて、シミュレーション部１０４によりシミュレーションを実行させ、その結果を取得する。シミュレーションの結果、エラーが発生しないシナリオについては、シナリオテーブル１１２にレコードを追加する。なお、シミュレーションとは、コンピューター上で、ロボットの状態、ロボットの周囲の環境の状態などをモデル化するとともに、ロボットを仮想的に動作させるものである。
【００４７】
また、シナリオ生成部１０３は、シナリオテーブル１１２に追加したレコードの優先度１１２ｆに、優先度を設定する。例えば、シミュレーションの結果に基づいて、シナリオ実行にかかったロボット３０の動作時間が小さいシナリオほど優先度を高く設定する。また、例えば、シミュレーションの結果に基づいて、ロボット３０の動作量（例えば、関節角度の変化量の合計、手先の移動距離など）が少ないシナリオほど優先度を高く設定してもよい。また、例えば、動作命令の数が少ないシナリオほど優先度を高く設定してもよい。
【００４８】
また、シナリオ生成部１０３は、一つのユーザー命令について複数のシナリオのレコードを追加した場合には、優先度１１２ｆが最も高いシナリオを、再生すべきシナリオとして選択する。
【００４９】
シミュレーション部１０４は、シナリオに基づくロボット３０の動作を、シミュレーションする。具体的には、シミュレーション部１０４は、状態検出部１０２により、ロボット３０の現在の状態と、ロボット３０の周囲の環境の現在の状態を検出する。また、シナリオ生成部１０３が生成した動作命令群と、検出した現在の状態とに基づいてロボット３０の動作（例えば、ハンドの移動、ワークの把持、ワークの開放など）をシミュレーションする。また、障害物への衝突がないか、動作許容範囲内の動作か、などをチェックする。また、シミュレーション部１０４は、シミュレーションの結果として、シミュレーションにおけるシナリオ実行後のロボット３０の状態とロボット３０の周囲の環境の状態を出力する。シミュレーション結果には、シナリオ実行にかかったロボット３０の動作時間、動作量などを特定する情報が含まれていてもよい。
【００５０】
例えば、動作命令が「ワークＷに（ワークＷの位置に）手先を移動する」である場合、シミュレーション部１０４は、検出した現在の状態を特定する情報に基づいて、ワークＷの位置及びロボットの手先の位置を認識し、手先をワークＷ付近に移動するシミュレーションを実行する。シミュレーション部１０４によるシミュレーションの処理は、公知の技術により実現できるので、詳細な説明は省略する。
【００５１】
シナリオ再生部１０５は、シナリオ生成部１０３により選択されたシナリオを再生する。具体的には、シナリオ再生部１０５は、選択されたレコードの動作命令群１１２ｄをシナリオテーブル１１２から取得する。それから、取得した動作命令群を、通信部１４０を介してロボット制御装置２０に出力する。なお、ロボット制御装置２０は、シナリオ再生部１０５からの動作命令群に基づいて制御命令を生成し、ロボット３０に出力する。このようにして、ユーザーにより教示された作業内容がロボット３０により実行される。
【００５２】
エラーチェック部１０６は、シナリオ再生にエラーがあったか否かをチェックする。具体的には、エラーチェック部１０６は、シナリオ再生の後、状態検出部１０２により、ロボット３０の現在の状態と、ロボット３０の周囲の環境の現在の状態を検出する。また、再生されたシナリオのシミュレーション結果１１２ｅをシナリオテーブル１１２から取得する。そして、検出した現在の状態とシミュレーション結果とに基づいて、ワークＷの位置、アームの位置、ロボット３０のセンサー値などに差分がないか等を判定することにより、エラーが発生していないか否かをチェックする。
【００５３】
上述したシナリオ再生装置１０は、例えば、図５（コンピューター６０のハードウェア構成の一例を示す図）に示すような、ＣＰＵ（Central Processing Unit）６１と、メモリー６２と、ＨＤＤ（Hard Disk Drive）等の補助記憶装置６３と、有線又は無線により通信ネットワークやロボット制御装置２０に接続するための通信インターフェイス（Ｉ／Ｆ）６４と、マウス、キーボード、タッチセンサーやタッチパネルなどの入力装置６５と、液晶ディスプレイなどの表示装置６６と、ＤＶＤ（Digital Versatile Disk）などの持ち運び可能な記憶媒体に対する情報の読み書きを行うメディアＩ／Ｆ６７と、を備えるコンピューター６０で実現できる。なお、ロボット制御装置２０も、例えば、図５に示すようなコンピューター６０で実現できる。
【００５４】
例えば、制御部１００は、補助記憶装置６３に記憶されている所定のプログラムをメモリー６２にロードしてＣＰＵ６１で実行することで実現可能である。記憶部１１０は、ＣＰＵ６１がメモリー６２又は補助記憶装置６３を利用することにより実現可能である。入力部１２０は、ＣＰＵ６１が入力装置６５を利用することで実現可能である。表示部１３０は、ＣＰＵ６１が表示装置６６を利用することで実現可能である。通信部１４０は、ＣＰＵ６１が通信Ｉ／Ｆ６４を利用することで実現可能である。なお、上記の所定のプログラムは、例えば、通信Ｉ／Ｆ６４を介してネットワーク上からダウンロードされてもよいし、メディアＩ／Ｆ６７に接続された記憶媒体からロードされてもよい。
【００５５】
上記の機能構成は、シナリオ再生装置１０の構成を理解容易にするために、主な処理内容に応じて分類したものである。構成要素の分類の仕方や名称によって、本願発明が制限されることはない。シナリオ再生装置１０の構成は、処理内容に応じて、さらに多くの構成要素に分類することもできる。また、１つの構成要素がさらに多くの処理を実行するように分類することもできる。また、各構成要素の処理は、１つのハードウェアで実行されてもよいし、複数のハードウェアで実行されてもよい。
【００５６】
また、例えば、シナリオ再生装置１０の少なくとも一部の機能は、ロボット制御装置２０に含まれ、ロボット制御装置２０により実現されてもよい。また、例えば、ロボット制御装置２０の少なくとも一部の機能は、ロボット３０に含まれ、ロボット３０により実現されてもよい。また、例えば、シナリオ再生装置１０及びロボット制御装置２０の少なくとも一部の機能は、ロボット３０に含まれ、ロボット３０により実現されてもよい。
【００５７】
図６は、シナリオ再生処理の一例を示すフロー図である。
【００５８】
ユーザー命令取得部１０１は、入力部１２０を介してユーザー命令が入力されたか否かを判定する（ステップＳ１０）。ユーザー命令が入力されていない場合（ステップＳ１０：Ｎ）、判定を継続する。
【００５９】
ユーザー命令が入力された場合（ステップＳ１０：Ｙ）、状態検出部１０２は、ロボット３０の現在の状態及びロボット３０の周囲の環境の現在の状態を検出する（ステップＳ２０）。
【００６０】
それから、シナリオ生成部１０３は、ステップＳ１０でユーザー命令取得部１０１により取得されたユーザー命令と、ステップＳ２０で状態検出部１０２により検出された現在の状態を特定する情報とに基づいて、シナリオを生成する（ステップＳ３０）。詳細は、図７で説明する。
【００６１】
それから、シナリオ生成部１０３は、シナリオの生成に成功したか否かを判定する（ステップＳ４０）。シナリオの生成に失敗した場合（ステップＳ４０：Ｎ）、制御部１００は、処理をステップＳ１０に戻す。
【００６２】
シナリオの生成に成功した場合（ステップＳ４０：Ｙ）、シナリオ再生部１０５は、シナリオを再生する（ステップＳ５０）。具体的には、シナリオ再生部１０５は、ステップＳ３０（後述する図７のステップＳ３９）で選択されたシナリオのレコードの動作命令群１１２ｄを、シナリオテーブル１１２から取得し、通信部１４０を介してロボット制御装置２０に出力する。
【００６３】
エラーチェック部１０６は、ステップＳ５０におけるシナリオ再生のエラーをチェックする（ステップＳ６０）。詳細は、図８で説明する。
【００６４】
それから、エラーチェック部１０６は、ステップＳ６０のチェック結果（後述する図８のステップＳ６５又はＳ６６）に基づいて、シナリオの再生が成功したか否かを判定する（ステップＳ７０）。シナリオの再生が成功した場合（ステップＳ７０：Ｙ）、制御部１００は、処理をステップＳ１０に戻し、次のユーザー命令を待つ。
【００６５】
シナリオの再生が失敗した場合（ステップＳ７０：Ｎ）、制御部１００は、処理をステップＳ２０に戻し、ステップＳ１０で取得された同じユーザー命令についてステップＳ２０以降の処理を行う。この場合、ステップＳ１０で取得された同じユーザー命令についてシナリオが再生成されることになるため、当該ユーザー命令に関して前回のシナリオ生成処理で記録されたレコードをシナリオテーブル１１２から削除する。
【００６６】
なお、ステップＳ６０の後、ステップＳ７０でＮ、ステップＳ２０、ステップＳ３０と処理が進む場合、ステップＳ２０をスキップし、ステップＳ３０ではステップＳ６２（後述する図８）検出された現在の状態を使用するようにしてもよい。
【００６７】
図７は、シナリオ生成処理の一例を示すフロー図である。なお、シナリオ生成処理は、図６のステップＳ３０に対応する。
【００６８】
シナリオ生成部１０３は、ライブラリー命令を選択する（ステップＳ３１）。具体的には、シナリオ生成部１０３は、ステップＳ１０（図６）でユーザー命令取得部１０１により取得されたユーザー命令を解析し、当該ユーザー命令に対応するライブラリー命令１１１ｂをライブラリーテーブル１１１から一つ選択する。例えば、ユーザー命令が「ワークＷを目的位置Ｄに置く」である場合、対象物を目的位置に移動するユーザー命令であると認識し、対象物を目的位置に移動するライブラリー命令「MoveFromTo(w, d, arm0)」又は「MoveFromTo(w, d, arm0, arm1)」を選択する。
【００６９】
それから、シナリオ生成部１０３は、ステップＳ３１で選択したライブラリー命令について設定すべき設定値を選択する（ステップＳ３２）。具体的には、シナリオ生成部１０３は、例えば、ライブラリー命令「MoveFromTo(w, d, arm0)」を選択した場合、変数ｗにはワークＷを特定する情報を設置値として固定的に選択し、変数ｄには目的位置Ｄを特定する情報を設定値として固定的に選択する。変数ａｒｍ０には、ロボット３０のアーム部３１Ａ（ａｒｍＡ）又はアーム部３２Ｂ（ａｒｍＢ）を特定する情報を設定値として選択する。すなわち、取り得る設定値の組み合わせのパターンを一つ選択する。
【００７０】
それから、シナリオ生成部１０３は、シナリオを生成する（ステップＳ３３）。具体的には、シナリオ生成部１０３は、ステップＳ３１で選択したライブラリー命令１１１ｂ及び対応付けられた動作命令群１１１ｃに、ステップＳ３２で選択した各設定値を設定することで、動作命令群を生成する。例えば、ライブラリー命令「MoveFromTo(w, d, arm0)」に、設定値Ｗ、Ｄ、ａｒｍＡを設定した場合、動作命令群「armA: Move to W」、「armA: Grasp W」、「armA: Move to D」、「armA: Release W」を生成することができる。
【００７１】
それから、シナリオ生成部１０３は、シミュレーション部１０４により、ステップＳ３３で生成したシナリオについてのシミュレーションを実行する（ステップＳ３４）。具体的には、シミュレーション部１０４は、ステップＳ３３で生成された動作命令群を取得する。また、状態検出部１０２により、ロボット３０の現在の状態と、ロボット３０の周囲の環境の現在の状態を検出する。また、取得した動作命令群と、検出した現在の状態とに基づいてロボット３０の動作をシミュレーションする。また、障害物への衝突がないか、動作許容範囲内の動作か、などをチェックする。また、シミュレーション部１０４は、シミュレーションの結果として、シミュレーションにおけるシナリオ実行後のロボット３０の状態とロボット３０の周囲の環境の状態を出力する。
【００７２】
それから、シナリオ生成部１０３は、ステップＳ３４のシミュレーション結果に基づいて、シナリオのシミュレーション実行に成功したか否かを判定する（ステップＳ３５）。シナリオのシミュレーション実行に成功した場合（ステップＳ３５：Ｙ）、シナリオ生成部１０３は、シナリオを記録する（ステップＳ３６）。
【００７３】
具体的には、シナリオ生成部１０３は、シナリオテーブル１１２にレコードを追加する。また、追加したレコードのシナリオＩＤ１１２ａに、新たに生成したＩＤを設定する。また、ライブラリー命令ＩＤ１１２ｂに、ステップＳ３１で選択したライブラリー命令のＩＤ１１１ａを設定する。また、設定値１１２ｃに、ステップＳ３２で選択した各設定値を設定する。また、動作命令群１１２ｄに、ステップＳ３３で生成した動作命令群を設定する。また、シミュレーション結果１１２ｅに、ステップＳ３４のシミュレーション結果を設定する。また、シナリオ生成部１０３は、シナリオテーブル１１２に含まれる各レコードのシミュレーション結果１１２ｅに基づいて、各レコードの優先度を決定し、優先度１１２ｆに設定する。優先度は、例えば、シナリオ実行にかかったロボット３０の動作時間又は動作量が小さいシナリオほど優先度を高く設定する。また、各シナリオの動作命令の数が少ないほど優先度を高く設定してもよい。
【００７４】
なお、本実施形態では、動作時間、動作量、動作命令などが少ないほど、シナリオ再生の成功率が高いと扱うものとする。もちろん、成功率を高めるという目的のもと、他のパラメータに基づいて優先度を設定してもよい。
【００７５】
シナリオのシミュレーション実行に失敗した場合（ステップＳ３５：Ｎ）、又は、ステップＳ３６でシナリオを記録した後、シナリオ生成部１０３は、ステップＳ３２においてライブラリー命令に設定可能な設定値の全ての組み合わせパターンを選択したか否かを判定する（ステップＳ３７）。全ての組み合わせパターンが選択されていない場合（ステップＳ３７：Ｎ）、処理をステップＳ３２に戻し、未選択のパターンを選択する。
【００７６】
全ての組み合わせパターンが選択された場合（ステップＳ３７：Ｙ）、シナリオ生成部１０３は、ステップＳ３１において選択可能な全てのライブラリー命令を選択したか否かを判定する（ステップＳ３８）。全てのライブラリー命令が選択されていない場合（ステップＳ３８：Ｎ）、処理をステップＳ３１に戻し、未選択のライブラリー命令を選択する。
【００７７】
全てのライブラリー命令が選択された場合（ステップＳ３８：Ｙ）、シナリオ生成部１０３は、本フローを終了する。
【００７８】
図８は、エラーチェック処理の一例を示すフロー図である。なお、シナリオ生成処理は、図６のステップＳ６０に対応する。
【００７９】
エラーチェック部１０６は、シミュレーション結果を取得する（ステップＳ６１）。具体的には、エラーチェック部１０６は、ステップＳ５０（図６）で再生されたシナリオのシミュレーション結果１１２ｅをシナリオテーブル１１２から取得する。
【００８０】
それから、エラーチェック部１０６は、状態検出部１０２により、ロボット３０の現在の状態と、ロボット３０の周囲の環境の現在の状態を検出する（ステップＳ６２）。
【００８１】
それから、エラーチェック部１０６は、エラーチェックを行う（ステップＳ６３）。具体的には、エラーチェック部１０６は、ステップＳ６１で取得したシミュレーション結果と、ステップＳ６２で取得した現在の状態とを比較し、差分があるか否かを判定する（差分が所定範囲内であるか否かを判定してもよい）。例えば、シミュレーション結果におけるワークＷの位置と、検出した現在のワークＷの位置とに差分があれば、何らかのエラーが発生したと判定できる。また、例えば、シミュレーション結果におけるロボット３０の手先の位置と、検出した現在のロボット３０の手先の位置とに差分があれば、何らかのエラーが発生したと判定できる。なお、エラーの判定方法は、上記の例に限定されない。
【００８２】
それから、エラーチェック部１０６は、ステップＳ６３の判定結果に基づいて、シナリオの再生にエラーが発生したか否かを判定する（ステップＳ６４）。エラーが発生していない場合（ステップＳ６４：Ｎ）、エラーチェック部１０６は、チェック結果として成功を出力し（ステップＳ６５）、本フローを終了する。エラーが発生していた場合（ステップＳ６４：Ｙ）、エラーチェック部１０６は、チェック結果として失敗を出力し（ステップＳ６６）、本フローを終了する。
【００８３】
なお、上記の図６〜図８のフローの各処理単位は、シナリオ再生装置１０の処理を理解容易にするために、主な処理内容に応じて分割したものである。処理単位の分割の仕方や名称によって、本願発明が制限されることはない。シナリオ再生装置１０の処理は、処理内容に応じて、さらに多くの処理単位に分割することもできる。また、１つの処理単位がさらに多くの処理を含むように分割することもできる。
【００８４】
次に、エラー発生前のシナリオとエラー発生後のシナリオの関係について、図９〜１４を参照して説明する。図９は、エラー発生前のシナリオ（一方のアームを使用する場合）の一例を説明する図である。図１０は、エラー発生前のシナリオ（両方のアームを使用する場合）の一例を説明する図である。図１１は、エラー発生前のシナリオ（他方のアームを使用する場合）の一例を説明する図である。図１２は、エラー発生後のシナリオ（一方のアームを使用する場合）の一例を説明する図である。図１３は、エラー発生後のシナリオ（両方のアームを使用する場合）の一例を説明する図である。図１４は、エラー発生後のシナリオ（他方のアームを使用する場合）の一例を説明する図である。
【００８５】
なお、ここでは、ユーザー命令として、「ワークＷを目的位置Ｄに置く」を想定する。また、図中では、ロボット３０のアームを「ａｒｍＡ」及び「ａｒｍＢ」と表し、ワークを「Ｗ」と表し、目的位置を「Ｄ」と表す。
【００８６】
図９は、生成されたシナリオ「MoveFromTo(W, D, armA)」を実際に再生した場合を示している。すなわち、（１）動作命令「armA: Move to W」及び「armA: Grasp W」が実行されることで、ａｒｍＡ及びＷの状態が（Ａ）から（Ｂ）へと遷移する。また、（２）動作命令「armA: Move to D」及び「armA: Release W」が実行されることで、ａｒｍＡ及びＷの状態が（Ｂ）から（Ｃ）へと遷移する。この場合、エラーが発生していないため、エラーチェックの結果は成功となる。
【００８７】
図１０は、生成されたシナリオ「MoveFromTo(W, D, armA, armB)」を実際に再生した場合を示している。すなわち、（１）動作命令「armA: Move to W」及び「armA: Grasp W」が実行されることで、ａｒｍＡ及びＷの状態が（Ａ）から（Ｂ）へと遷移する。また、（３）動作命令「armA: Move to R」、「armB: Move to R」、及び「armB: Grasp W」が実行されることで、ａｒｍＡ、ａｒｍＢ、及びＷの状態が（Ｂ）から（Ｄ）へと遷移する。また、（４）動作命令「armA: Release W」、「armB: Move to D」、及び「armB: Release W」が実行されることで、ａｒｍＡ、ａｒｍＢ、及びＷの状態が（Ｄ）から（Ｅ）へと遷移する。この場合、エラーが発生していないため、エラーチェックの結果は成功となる。
【００８８】
図１１は、参考のため、生成されたシナリオ「MoveFromTo(W, D, armB)」は、シミュレーションによりエラーとなる場合を示している。すなわち、（５）動作命令「armB: Move to W」をシミュレーションにより実行しても、ａｒｍＢがＷに届かないため、このシナリオはシナリオテーブル１１２に記録されない。
【００８９】
図１２は、シナリオ「MoveFromTo(W, D, armA)」を実際に再生したが、アームの手先からワークＷが落ちるというエラーが発生し、その後、同じシナリオ「MoveFromTo(W, D, armA)」が生成及び選択され、再生された場合を示している。図中の破線のＷの位置は、図９（Ａ）の実線のＷの位置と同じであり、図中の実線のＷの位置は、手先から落ちた位置である。（１）動作命令「armA: Move to W」及び「armA: Grasp W」が実行されることで、ａｒｍＡ及びＷの状態が（Ａ１）から（Ｂ１）へと遷移する。また、（２）動作命令「armA: Move to D」及び「armA: Release W」が実行されることで、ａｒｍＡ及びＷの状態が（Ｂ１）から（Ｃ１）へと遷移する。このように、エラーが発生しても、ユーザー命令を再入力することなく、新たに選択されたシナリオでユーザー命令を実現することができる。
【００９０】
図１３は、シナリオ「MoveFromTo(W, D, armA)」を実際に再生したが、アームの手先からワークＷが落ちるというエラーが発生し、その後、別のシナリオ「MoveFromTo(W, D, armA, armB)」が生成及び選択され、再生された場合を示している。図中の破線のＷの位置は、図９（Ａ）の実線のＷの位置と同じであり、図中の実線のＷの位置は、手先から落ちた位置である。（１）動作命令「armA: Move to W」及び「armA: Grasp W」が実行されることで、ａｒｍＡ及びＷの状態が（Ａ１）から（Ｂ１）へと遷移する。また、（３）動作命令「armA: Move to R」、「armB: Move to R」、及び「armB: Grasp W」が実行されることで、ａｒｍＡ、ａｒｍＢ、及びＷの状態が（Ｂ１）から（Ｄ１）へと遷移する。また、（４）動作命令「armA: Release W」、「armB: Move to D」、及び「armB: Release W」が実行されることで、ａｒｍＡ、ａｒｍＢ、及びＷの状態が（Ｄ１）から（Ｅ１）へと遷移する。このように、エラーが発生しても、ユーザー命令を再入力することなく、新たに選択されたシナリオでユーザー命令を実現することができる。
【００９１】
図１４は、シナリオ「MoveFromTo(W, D, armA)」を実際に再生したが、アームの手先からワークＷが落ちるというエラーが発生し、その後、別のシナリオ「MoveFromTo(W, D, armB)」が生成及び選択され、再生された場合を示している。すなわち、エラー発生後は、ａｒｍＢがＷに届く場合である。図中の破線のＷの位置は、図９（Ａ）の実線のＷの位置と同じであり、図中の実線のＷの位置は、手先から落ちた位置である。（５）動作命令「armB: Move to W」及び「armB: Grasp W」が実行されることで、ａｒｍＢ及びＷの状態が（Ａ１）から（Ｆ１）へと遷移する。また、（６）動作命令「armB: Move to D」及び「armB: Release W」が実行されることで、ａｒｍＢ及びＷの状態が（Ｆ１）から（Ｇ１）へと遷移する。このように、エラーが発生しても、ユーザー命令を再入力することなく、新たに選択されたシナリオでユーザー命令を実現することができる。
【００９２】
以上、本発明の一実施形態について説明した。本実施形態によれば、ロボットの動作中に発生したエラーから簡単にリカバーできるようにすることができる。
【００９３】
すなわち、本実施形態では、シナリオの実行によりエラーが発生した場合でも、ユーザー命令を再入力することなく、現在の状態（エラーの発生した状態）に基づいて代替的なシナリオが再生成されて実行されるため、エラーから簡単にリカバーすることができる。また、シナリオ生成の際にシミュレーションを実行することで、エラーが予測されるシナリオが再生されないようにすることができる。また、各シナリオの動作時間、動作量、動作命令の数などに基づいて、各シナリオの優先度を決定し、各シナリオの優先度に基づいてシナリオを選択して再生することで、シナリオ再生の成功率を高めることができる。また、シミュレーション結果と、ロボットの現在の状態及びロボットの現在の周囲の環境の状態とを比較することで、ロボットの故障などの内部的なエラーだけでなく、新たに障害物が発生した、ワークの位置が目的位置からずれているなどの外部的なエラーも検出することができる。
【００９４】
なお、以上の本発明の一実施形態は、本発明の要旨と範囲を例示することを意図し、限定するものではない。多くの代替物、修正、変形例は当業者にとって明らかである。
【００９５】
例えば、エラーチェック部１０６は、実際に再生されたシナリオごとに、過去の再生の成功率（例えば、総再生回数に対するエラーが発生しなかった再生回数の割合）を関連付けて記録するようにしてもよい。また、シナリオ生成部１０３は、シナリオテーブル１１２に追加したシナリオに優先度を設定する際に、上述の過去の成功率が高いシナリオほど高い優先度を設定するようにしてもよい。なお、過去に再生されていないシナリオを追加した場合には、当該シナリオを所定の成功率（例えば、１００％、０％、５０％）と扱って優先度を決定すればよい。このようにしても、シナリオ再生の成功率を高めることができる。
【００９６】
例えば、ロボット３０は、双腕に限られず、単腕、３腕以上を可動部として備えるようにしてもよい。また、可動部の関節数は、特に限られず、例えば、７軸とすることができる。また、双腕以上の場合は、各腕の関節数は異なっていてもよい。
【符号の説明】
【００９７】
１：ロボットシステム、１０：シナリオ再生装置、２０：ロボット制御装置、３０：ロボット、３１（３１Ａ、３１Ｂ）：アーム部、３２：リンク、３３：ジョイント、３６：ハンド、４０：撮影装置、
６０：コンピューター、６１：ＣＰＵ、６２：メモリー、６３：補助記憶装置、６４：通信Ｉ／Ｆ、６５：入力装置、６６：表示装置、６７：メディアＩ／Ｆ、
１００：制御部、１０１：ユーザー命令取得部、１０２：状態検出部、１０３：シナリオ生成部、１０４：シミュレーション部、１０５：シナリオ再生部、１０６：エラーチェック部、１１０：記憶部、１２０：入力部、１３０：表示部、１４０：通信部、
１１１：ライブラリーテーブル、１１１ａ：ライブラリー命令ＩＤ、１１１ｂ：ライブラリー命令、１１１ｃ：動作命令群、１１２：シナリオテーブル、１１２ａ：シナリオＩＤ、１１２ｂ：ライブラリー命令ＩＤ、１１２ｃ：設定値、１１２ｄ：動作命令群、１１２ｅ：シミュレーション結果、１１２ｆ：優先度
【図１】
2014124735.tif 000003
【図２】
2014124735.tif 000004
【図３】
2014124735.tif 000005
【図４】
2014124735.tif 000006
【図５】
2014124735.tif 000007
【図６】
2014124735.tif 000008
【図７】
2014124735.tif 000009
【図８】
2014124735.tif 000010
【図９】
2014124735.tif 000011
【図１０】
2014124735.tif 000012
【図１１】
2014124735.tif 000013
【図１２】
2014124735.tif 000014
【図１３】
2014124735.tif 000015
【図１４】
2014124735.tif 000016