このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
Unity 3D での ROS を使用したピックアンドプレース ワークフロー
この例では、Kinova® Gen3 などのロボット マニピュレーター用のエンドツーエンドのピックアンドプレース ワークフローを設定し、Unity® ゲーム エンジンでロボットをシミュレートする方法を示します。
概要
この例では、Kinova Gen3 マニピュレーターを使用して、目標物を識別してビンに入れます。この例では、3 つのツールボックスのツールを使用します。
Robotics System Toolbox™ — マニピュレーターをモデル化してシミュレートします。
Stateflow® — 例にある高水準のタスクをスケジュールし、タスクからタスクへとシミュレーションをステップ実行します。
ROS Toolbox™ — MATLAB® を Unity に接続します。
この例は、以下の関連する例の主要概念に基づいています。
Kinova Gen3 マニピュレーターを使用したタスク空間およびジョイント空間の軌跡の計画と実行 (Robotics System Toolbox) — エンドエフェクタの初期姿勢から目的の姿勢に移動するための内挿されたジョイント軌跡を生成してシミュレートする方法を示します。
MATLAB 向けに Stateflow を使用したピックアンドプレースのワークフロー (Robotics System Toolbox) — Kinova Gen3 などのロボット マニピュレーター用のエンドツーエンドのピックアンドプレース ワークフローを設定する方法を示します。
Gazebo およびシミュレートされた TurtleBot の入門 — MATLAB と Gazebo の間の接続を設定する方法を示します。
Gazebo での ROS を使用したピックアンドプレース ワークフロー (Robotics System Toolbox) — Kinova Gen3 などのロボット マニピュレーター用のエンドツーエンドのピックアンドプレース ワークフローを設定し、Gazebo 物理シミュレーターでロボットをシミュレートする方法を示します。
Robotics と Simscape を使用したマニピュレーター アームのモデル化と制御 (Robotics System Toolbox) — Simulink® でロボットのアルゴリズムを設計してから Simscape™ を使用してテスト環境でアクションをシミュレートする方法を示します。
MATLAB® から Unity® ゲーム エンジンを設定して起動するには、Set Up and Connect to Unity Game Engineを参照してください。
ピックアンドプレース ワークフロー
ピックアンドプレース タスクの開始
MATLAB でのロボット モデルの読み込み
このシミュレーションでは、Robotiq グリッパーが接続された Kinova Gen3 マニピュレーターを使用します。.mat
ファイルからrigidBodyTree
(Robotics System Toolbox)オブジェクトとしてロボット モデルを読み込みます。
load("exampleHelperKINOVAGen3GripperROSUnity.mat");
ピックアンドプレース コーディネーターの初期化
ロボットの初期コンフィギュレーションを設定します。ロボット モデル、初期コンフィギュレーション、およびエンドエフェクタ名を指定して、ロボット制御を処理するコーディネーターを初期化します。
initialRobotJConfig = [3.5797 -0.6562 -1.2507 -0.7008 0.7303 -2.0500 -1.9053];
endEffectorFrame = "gripper";
coordinator = exampleHelperCoordinatorPickPlaceROSUnity(robot,initialRobotJConfig,endEffectorFrame);
Sending robots to initial positions...
Unity で、initialRobotJConfig
で指定された位置にロボット モデルが移動していることを確認します。
目標物を配置するために、ホーム コンフィギュレーションと 2 つの姿勢を指定します。
coordinator.HomeRobotTaskConfig = getTransform(robot,initialRobotJConfig,endEffectorFrame); coordinator.PlacingPose{1} = trvec2tform([0.2 0.55 0.26])*axang2tform([0 0 1 pi/2])*axang2tform([0 1 0 pi]); coordinator.PlacingPose{2} = trvec2tform([0.2 -0.55 0.26])*axang2tform([0 0 1 pi/2])*axang2tform([0 1 0 pi]);
シミュレーションの実行と可視化
コーディネーターを Stateflow チャートに接続します。開始された Stateflow チャートは、目標物の検出、つまみ上げ、および正しいステージング領域への配置という各ステートを連続的に経由させます。
coordinator.FlowChart = exampleHelperFlowChartPickPlaceROSUnity("coordinator",coordinator);
ピックアンドプレース タスクの実行を開始するためのダイアログ ボックスを作成します。シミュレーションを開始するには、ダイアログ ボックスで [Yes] をクリックします。
answer = questdlg("Do you want to start the pick-and-place job now?", ... "Start job","Yes","No", "No"); switch answer case "Yes" % Trigger event to start Pick and Place in the Stateflow Chart coordinator.FlowChart.startPickPlace; case "No" coordinator.FlowChart.endPickPlace; delete(coordinator.FlowChart) delete(coordinator) end
Unity でロボット モデルを観察し、ピックアンドプレース アクションが実行されることを確認します。
ピックアンドプレース タスクの終了
新しい目標物の検出に 4 回失敗すると、Stateflow チャートは自動的に停止します。ピックアンドプレース タスクを途中で停止するには、以下のコード行をコメント解除して実行するか、コマンド ウィンドウを選択して "Ctrl+C" を押します。
% coordinator.FlowChart.endPickPlace; % delete(coordinator.FlowChart) % delete(coordinator)
Unity でのピックアンドプレース アクションの可視化
Unity のシーンに、作業領域内でロボットが目的の位置に目標物を移動する様子が表示されます。すべての目標物が配置されるまで、ロボットは動作を続けます。検出ステップで 4 回にわたって目標物が見つからない場合、Stateflow チャートは終了します。
if strcmp(answer,"Yes") while coordinator.NumDetectionRuns < 4 % Wait for no objects to be detected. end end
ROS TCP エンドポイント ノードを強制終了し、ROS ネットワークをシャットダウンします。
helperKillTCPEndpointNode; rosshutdown;
Shutting down global node /matlab_global_node_37032 with NodeURI http://hyd-shivarad:64473/ and MasterURI http://localhost:11311. Shutting down ROS master on http://172.18.250.141:11311.