0

Nao さんの赤玉検出 API を使って何かしようとしています。私はすべてを一歩一歩やりたいと思っています。コールバックの先頭に callbackMutex every を書きました。if ステートメントのコールバックでイベントをサブスクライブ解除します。

関数は機能しますが、「INFO: Thread limit reached」エラーまたは unsubscribe イベント エラーが発生することがあります。

Nao はいつも赤いボールを目にしますが、多くのスレッドを作成します (と思います)。1 つのスレッドのみを使用するにはどうすればよいですか?

私はc ++で書いています。

私はこのように購読します:

memory.subscribeToEvent("redBallDetected", "moduleName", "fuctionName");

Nao がボールを見ると、この関数が呼び出されます。

void moduleName::functionName()
{
ALCriticalSection section(callbackMutex);
//create some proxies and declare some variables

try
{
//do movements
}
catch(const ALError& e) {
        qiLogError("module.name") << e.what() << std::endl;
      }
}

setWalkTargetVelocity を使用してロボットを歩き、if ステートメントでロボットが歩くか停止するかをチェックします。スレッドを開始または停止するために何も使用しませんでした。

4

2 に答える 2

0

トリックは次のとおりです。

  • コールバックで長時間スタックしないことを確認する必要があるため、async walk メソッドを呼び出すことは良いことです。

  • walk メソッドには時間がかかるため、あまり頻繁に呼び出すべきではありません: ~400ms が最小値です

  • コールバックに到着したら、前のコールバックが終了するのを待たずにそのままにしておきます。次回はより新しい情報を受け取ることができるからです。つまり、新しい情報を受け取ったら過去の情報は役に立たないので、行き詰まらないでください。

于 2014-06-02T15:26:10.010 に答える