2012-04-17 17 views
0

iRobot CreateでPlayer(Player/Stage)を使用しています。 playerc_client_readを呼び出して、playerc_position2dプロキシを正しく登録していれば、プロキシのメンバーpx、py、paにxとyで移動した距離にアクセスできるはずです(メートル単位)。回転(ラジアン単位)。マルチスレッドアプリケーションで、作成のオドメトリーデータが正しく取得されない

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

しかし、ロボットコントローラを独自のスレッド(pthreads)に移動しようとすると、いくつかの問題が発生します。問題は、pxだけが更新されているようだということです。 PYとPAは常にyPositionとラジアンは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 

と案の定、唯一xPositionがこれまで設定されているの要旨です0

残ります。

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

全開示:私は大学院生で、これはクラスプロジェクトのためのものです。

答えて

0

ここでの問題は必ずしもスレッド化ではありません。

私たちが発見したことは、特にネットブックがその上に座っているとき、Createの内部オドメトリーは非常に矛盾しているということです。

正確な読みを得るには、角速度を十分に高く設定する必要があります(私たちの場合、0.11rads/s以上)。

This siteいくつかのことを説明するのに役立ちました。つまり、Createsはオドメトリーの決定にモーターパワーを使用し、ホイールカウンターやアナログは使用しません。

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

私たちの具体的な問題は、マルチスレッドのケースでは角速度を低く設定して変更を登録するスレッシュホールドが原因で発生しましたが、シーケンシャルコードにはこのようなしきい値がありませんでした。

関連する問題