私は Ubuntu の C/C++ でモバイル ロボティクス アプリケーションを作成しています。現在、レーザー センサーを使用して環境をスキャンし、ロボットの移動時にオブジェクトとの衝突を検出しています。
このレーザーのスキャン範囲は 270°、最大半径は 4000mm です。この範囲内の物体を検出し、センサーからの距離を報告することができます。
各距離は平面座標であるため、より読みやすいデータを得るために、それらを平面座標からデカルト座標に変換し、テキスト ファイルに出力してから、MatLab でプロットして、レーザーが検出したものを確認します。
この図は、デカルト座標での典型的な検出を示しています。 値はメートル単位なので、0.75 は 75 センチメートル、2 は 2 メートルです。連続する青い点は検出されたすべてのオブジェクトですが、(0,0) に近い点はレーザー位置を参照し、破棄する必要があります。レーザー スキャン領域が 270° であるため、y < 0 の下の青い点が生成されます。赤い線の正方形 (1.5 x 2 メートル) を追加して、衝突チェックを実装したい領域を決定しました。そのため、その領域内にポイント (オブジェクト) があるかどうかをリアルタイムで検出し、ある場合はいくつかの関数を呼び出したいと考えています。これは少しトリッキーです。なぜなら、このチェックでは、決定する連続したポイントがあるかどうかも検出できるはずだからです。オブジェクトが実在するかどうか (つまり、点を検出した場合、最も近い点を検索して、それらがオブジェクトを構成しているかどうか、または検出エラーの可能性がある単なる点であるかどうかを判断する必要があります)。
これは、単一のスキャンを実行するために使用する関数です。
struct point pt[limit*URG_POINTS];
//..
for(i = 0; i < limit; i++){
for(j = 0; j < URG_POINTS; j++){
ang2 = kDeg2Rad*((j*240/(double)URG_POINTS)-120);
offset = 0.03; //it depends on sensor module [m]
dis = (double) dist[cnt] / 1000.0;
//THRESHOLD of RANGE
// if(dis > MAX_RANGE) dis = 0; //MAX RANGE = 4[m]
// if(dis < MIN_RANGE) dis = 0;
pt[cnt].x = dis * cos(ang2) * cos(ang1) + (offset*sin(ang1)); // <-- X POINTS
pt[cnt].y = dis * sin(ang2); // <-- Y POINTS
// pt[cnt].z = dis * cos(ang2) * sin(ang1) - (offset*cos(ang1)); <- I disabled 3D mapping at the moment
cnt++;
}
ang1 += diff;
}
1 回のスキャンごとに、ptには検出されたすべての点が xy 座標で含まれます。
私はこのようなことをしたいと思います:
- 単一のスキャンを実行し、最後に、
- 各 pt.x および pt.y に衝突チェックを適用する
- 内側の領域にポイントが見つかった場合は、他の近くのポイントを確認し、そうであればロボットを停止します。
- そうでない場合、または他の近くのポイントが見つからない場合は、別のスキャンを開始します
以前に定義された領域内のオブジェクト (複数の単一点で構成される) を簡単にチェックする方法を知りたいです。
助けてくれませんか?私にはとても難しいようです:(