メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

Unity 3D での ROS を使用したピックアンドプレース ワークフロー

この例では、Kinova® Gen3 などのロボット マニピュレーター用のエンドツーエンドのピックアンドプレース ワークフローを設定し、Unity® ゲーム エンジンでロボットをシミュレートする方法を示します。

概要

この例では、Kinova Gen3 マニピュレーターを使用して、目標物を識別してビンに入れます。この例では、3 つのツールボックスのツールを使用します。

  • Robotics System Toolbox™ — マニピュレーターをモデル化してシミュレートします。

  • Stateflow® — 例にある高水準のタスクをスケジュールし、タスクからタスクへとシミュレーションをステップ実行します。

  • ROS Toolbox™ — MATLAB® を Unity に接続します。

この例は、以下の関連する例の主要概念に基づいています。

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.