1

これが私のコードです:

/*
Scott Landau
Robot Lab Assignment 1
*/    

// Standard Java Libs

import java.io.*;

// Player/Stage Libs

import javaclient2.*;
import javaclient2.structures.*;
import javaclient2.structures.sonar.*;

// Begin

public class SpinningRobot

{
    public static Position2DInterface pos = null;
    public static LaserInterface laser = null;

    public static void main(String[] args)
    {
        PlayerClient robot = new PlayerClient("localhost", 6665);
        laser = robot.requestInterfaceLaser(0, PlayerConstants.PLAYER_OPEN_MODE);
        pos = robot.requestInterfacePosition2D(0,PlayerConstants.PLAYER_OPEN_MODE);

        robot.runThreaded (-1, -1);

        pos.setSpeed(0.5f, -0.25f);

        // end pos
        float x, y;
        x = 46.0f;
        y = -46.0f;

        boolean done = false;

        while( !done ){

            if(laser.isDataReady()) { 

                float[] laser_data = laser.getData().getRanges();

                System.out.println("== IR Sensor ==");
                System.out.println("Left Wall Distance: "+laser_data[360]);
                System.out.println("Right Wall Distance: " +laser_data[0]);

                // if laser doesn't reach left wall, move to detect it
                // so we can guide using left wall
                if ( laser_data[360] < 0.6f ) {
                    while ( laser_data[360] < 0.6f ) {

                        pos.setSpeed(0.5f, -0.5f);
                    }
            } else if ( laser_data[0] < 0.6f ) {
                                                                                                   while(laser_data[0<0.6f)                                       {                                    pos.setSpeed(0.5f, 0.5f);
                                   }
            }
                pos.setSpeed(0.5f, -0.25f);



// end pos?
done = ( (pos.getX() == x) && (pos.getY() == y) );  
            }

        }

    }





} // End

私は、ルンバがわずかに右に曲がるように連続して移動させようとしましたが、レーザーで認識された場合、接近した各壁からすばやく離れました。この 1 つのロボットには、laser_data[360] と laser_data[0] しか使用できません。これは最終的に迷路をナビゲートすると思います。

ただし、私は Player Stage プラットフォームを使用しており、このコードを使用して Roomba が壁に近づくと Stage がフリーズします。その理由はわかりません。

また、より良い迷路ナビゲーション アルゴリズムを考えられる場合は、お知らせください。

ありがとうございました!

4

1 に答える 1

1

距離 0.6 前後で振動しているため、壁に引っかかっているように見えます。

例えば:

  1. ドライブは壁に向かって角度をつけ、最終的に < 0.6f に達します
  2. 壁から離れて回転し、> 0.6f になったら停止します。つまり、0.6000001f (たとえば)
  3. 通常の軌道を再開します。
  4. ほぼ即座に < 0.6f
  5. 後藤2

壁に向かって少し角度をつけたり、壁から少し離れたりすると行き詰まります。

緩衝地帯が必要です。壁から MIN_DIS の距離内に到達したら、かなりの量で BUFFER_DIS > MIN_DIS となる壁から BUFFER_DIS に到達するまで遠ざかる必要があります。

編集:

いくつか問題があるようです。最初に、laser_data が壁に近いかどうかを確認し、近い場合は壁に向かって回転しています。壁に近づいていないかどうかを確認し、壁に向かって回転する必要があります。

2 番目に、非常にタイトな while ループに入っており、車輪の速度を調整しています。これはおそらく悪いことを引き起こすでしょう。壁から離れすぎている場合は、 trackWall() 関数を呼び出す必要があります。この関数は、別のループで laser.isDataReady() をポーリングします。それか、メインのポーリング ループにステート マシンが必要です。そうでない場合は、古いレーザー データで無意味にホイール速度を調整していることになります。

第三に、壁が常に 0.6f 以内になることを保証できますか? そうでない場合、ロボットが壁から遠く離れた場合、ロボットは無限にスピンします。

于 2010-04-13T17:14:47.200 に答える