0

私たちのプロジェクトは(http://www.play4health.com/p4h_eng/)overを使用Ogre 3D していUbuntu 11.04ます。コアサービスを除いて、すべてはプラグイン機能を利用するプラグインアーキテクチャに基づいていますOgre 3d

プラグインアーキテクチャでは、プラグインは次のようになります。

  • ビデオゲーム
  • 相互作用の方法

ユーザーは、タプルを作成するセッションを構成します(ビデオゲーム、インタラクションメソッド)。フローはセッションです:*ユーザーは自分のセッションをロードします。*ユーザーがセッションのタプルの1つをクリックし、特定のインタラクション方法でビデオゲームをプレイします。*セッションのすべてのアクティビティが終了するまで繰り返します。

プラグインは、要求に応じて動的にロード/アンロードされます。

このインタラクション方法の1つは、openniを使用したハンドトラッキングです。何が問題ですか?*openniプラグインがロードされている最初の時間はすべて完全に機能します。*次回プラグインopenniをロードする必要がある場合、システムはジェスチャを検出できますが、ハンドトラッキングは実行できません。すべてのプラグインが同じプロセスで実行されることに注意してください。現在のところ、唯一の解決策はプラットフォームを再起動することです。

OpenNIこれは、プラグインのinitとreleaseのコードです。

  bool IPKinectPlugin::onInitialise()
  {
    mHandPointer.mId = "KinectHandPointer";
    mHandPointer.mHasAbsolute = true;
    mHandPointer.mHasRelative = false;

    XnStatus nRetVal = XN_STATUS_OK;

    nRetVal = gContext.InitFromXmlFile(String(this->getPluginInfo()-
  >getResPath() + "SamplesConfig.xml").c_str());
    CHECK_RC(nRetVal, bContext, "InitFromXml");

  #if SHOW_DEPTH
    nRetVal = gContext.FindExistingNode(XN_NODE_TYPE_DEPTH,gDepthGenerator);
    bDepthGenerator = (nRetVal != XN_STATUS_OK);
    if (bDepthGenerator)
    {
    nRetVal = gDepthGenerator.Create(gContext);
    CHECK_RC(nRetVal, bDepthGenerator, "Find Depth generator");
    }
  #endif


    nRetVal = gContext.FindExistingNode(XN_NODE_TYPE_USER, gUserGenerator);
    bUserGenerator = (nRetVal != XN_STATUS_OK);
    if (/*bUserGenerator*/false)
    {
    nRetVal = gUserGenerator.Create(gContext);
    CHECK_RC(nRetVal, bUserGenerator, "Find user generator");
    }

    nRetVal = gContext.FindExistingNode(XN_NODE_TYPE_GESTURE, gGestureGenerator);
    bGestureGenerator = (nRetVal != XN_STATUS_OK);
    if (bGestureGenerator)
    {
    nRetVal = gGestureGenerator.Create(gContext);
    CHECK_RC(nRetVal, bGestureGenerator, "Find gesture generator");

    XnCallbackHandle hGestureCallbacks;
    gGestureGenerator.RegisterGestureCallbacks(gestureRecognized, gestureProcess, 0,
        hGestureCallbacks);
    }

    nRetVal = gContext.FindExistingNode(XN_NODE_TYPE_HANDS,gHandsGenerator);
    bHandsGenerator = (nRetVal != XN_STATUS_OK);
    if (bHandsGenerator)
    {
    nRetVal = gHandsGenerator.Create(gContext);
    CHECK_RC(nRetVal, bHandsGenerator, "Find hands generator");

    XnCallbackHandle hHandsCallbacks;
    gHandsGenerator.RegisterHandCallbacks(handsNew, handsMove,handsLost, 0, hHandsCallbacks);
    }

    nRetVal = gContext.FindExistingNode(XN_NODE_TYPE_DEVICE, gDevice);
    bDevice = (nRetVal != XN_STATUS_OK);

    gContext.RegisterToErrorStateChange(onErrorStateChanged, NULL, hDummyCallbackHandle);

    //Preparo la textura para la webcam
    if (bGenerateRGBTexture)
    mWebcamTexture = KinectTools::createDepthTexture("KinectWebCamTexture", sPluginName);

    return true;
  }
  //-----------------------------------------------------------------------------

  bool IPKinectPlugin::onShutdown()
  {
    if (bContext)
    {
    if (bHandsGenerator)
    {
        gHandsGenerator.StopTrackingAll();
    }
    if (bGestureGenerator)
    {
        gGestureGenerator.RemoveGesture(GESTURE_TO_USE);
        gGestureGenerator.RemoveGesture(GESTURE_TO_START);
    }
    gContext.StopGeneratingAll();
    gContext.Shutdown();
    }

    return true;
  }

この問題について何か考えはありますか?このコードに何か問題がありますか?

4

1 に答える 1

0

その間、すでに解決策を見つけているかもしれません...

通常は Java Wrapper を使用しますが、私のコードとの違いは、ジェネレーター (Depth、Hands など) を作成した後に contect.startGeneratingAll() を呼び出すことです。起動時にこれを複数回行ったときにも問題がありました。もう 1 つの違いは、シャットダウン時に context.release を使用することです。

私の手順は通常次のとおりです。

  • 初期設定 (ライセンス、ノード、設定)
  • ジェネレーターを作成する
  • すべての生成を開始
  • コードを実行します...
  • すべての生成を停止
  • コンテキスト解放

OpenNIのドキュメントから

XN_C_API void XN_C_DECL xnShutdown (XnContext * pContext)

OpenNI コンテキストをシャットダウンし、そのすべてのノードを破棄します。このメソッドを呼び出した後は、このコンテキストまたは相関ノードの関数を呼び出さないでください。注: この関数は、コンテキストとそれが保持するすべてのノードを破棄するため、慎重に使用する必要があります。通常は xnContextRelease() を呼び出すだけです。

于 2012-07-23T05:26:17.177 に答える