0

iRobot Create で Player (Player/Stage) を使用しています。ロボットからオドメトリ データを取得するためのインターフェイスは非常に単純です。playerc_client_read を呼び出すと、playerc_position2d プロキシを適切にサブスクライブしていれば、プロキシのメンバー px、py、pa に x および y の移動距離 (メートル単位); および回転 (ラジアン単位)。

シングル スレッド アプリケーションでこれを行うことに問題はありません。すべてのオドメトリ データは、必要な場所に完全に配置されています。

ただし、ロボット コントローラーを独自のスレッド (pthreads を使用) に移動しようとすると、いくつかの問題が発生します。問題は、px だけが更新されているように見えることです。py と pa は常に 0 のままです。

ロボットスレッドの要点は次のとおりです

//declare everything (including the playerc_client_t* object and playerc_position2d_t* object)
//connect to server (in pull mode or push mode, it doesn't seem to matter)
//subscribe to position2d proxy

while(!should_quit) {
playerc_client_read(client)
double xPosition = position2d->px;
double yPosition = position2d->py;
double radians = position2d->pa;

//do some stuff
sleep(10 milliseconds)
}
cleanup and unsubscribe

そして案の定、ロボットがどのように動いても、yPosition とラジアンは 0 のままですが、xPosition のみが設定されます。

オンラインで他に何も見つかりませんでした。これは既知のバグですか? 他の誰かがこの問題を抱えていますか? なぜこれが起こっているのかについて誰かが洞察を提供できますか? ありがとうございました。

完全な開示: 私は大学院生で、これはクラス プロジェクト用です。

4

1 に答える 1

0

ここでの問題は、必ずしもスレッドに関するものではありません。

私たちが見つけたのは、特にネットブックがその上にある場合、Create の内部オドメトリは非常に一貫性がないということです。

正確な読み取りに似たものを得るには、角速度を十分に高く設定する必要があります (この場合は 0.11 rads/s を超えます)。

このサイトは、いくつかのことを説明するのに役立ちました-つまり、クリエイトは、ホイールカウンターやあらゆる種類のアナログではなく、モーターパワーを使用してオドメトリーを決定します.

推測航法タスクの正確なオドメトリを取得するには、独自の正確な推定器を構築するか、位置の変化に関するより良い情報を提供する外部センサーを使用する必要があります。

私たちの特定の問題は、変化を登録するために角速度を低く設定するマルチスレッドの場合のしきい値処理によって引き起こされましたが、シーケンシャル コードにはそのようなしきい値処理がありませんでした。

于 2012-04-17T21:48:58.503 に答える