예제 #1
0
        /// <summary>
        /// 自己位置推定  開始位置セット
        /// </summary>
        /// <param name="stWldX">マップ座標X</param>
        /// <param name="stWldY">マップ座標Y</param>
        /// <param name="stDir">角度</param>
        public void SetStartPostion(int stWldX, int stWldY, double stDir)
        {
            startMapX   = stWldX;
            startMapY   = stWldY;
            startMapDir = stDir;

            MRF = new MapRangeFinder(LRF_Ctrl.LRFmaxRange_mm / MapToRealScale);    // 仮想Map用 LRFクラス

            worldMap.UpdateAreaCenter(stWldX, stWldY);
            AreaBmp = worldMap.AreaGridMap.UpdateBitmap();
            //bAreaMapUpdateReqest = false;

            MRF.SetMap(worldMap.AreaGridMap);

            // ロボットマーカ設定
            R1 = new MarkPoint(stWldX, stWldY, stDir);    // 実ロボット位置 R.E,Compass,GPSでの位置+ LRF補正

            E1    = new MarkPoint(stWldX, stWldY, stDir); // R.Encoderの位置
            oldE1 = new MarkPoint(stWldX, stWldY, stDir); //

            E2 = new MarkPoint(stWldX, stWldY, stDir);    // R.E Pluse & Compus の位置

            V1    = new MarkPoint(stWldX, stWldY, stDir); // 推定位置ロボット
            C1    = new MarkPoint(0, 0, stDir);
            G1    = new MarkPoint(0, 0, 0);               // GPS
            oldG1 = new MarkPoint(stWldX, stWldY, stDir); //

            A1 = new MarkPoint(0, 0, 0);                  // AMCL

            // パーティクルフィルター初期化
            {
                // サンプル数(ParticleSizeと同じで、すべてのパーティクルを対象とする)
                // LRFの有効距離を半径に変換(/2.0)、20%の距離で散らばる
                // +-5度の範囲
                ParticleFilter = new ParticleFilter(ParticleSize, (((LRF_Ctrl.LRFmaxRange_mm / 2.0) * 0.20) / MapToRealScale), 30.0);         // サンプリング数、パーティクルのレンジ

                Particles = new List <Particle>();
                for (int i = 0; i < ParticleSize; ++i)
                {
                    // パーティクルマーカー
                    Particles.Add(new Particle(new MarkPoint(0, 0, 0), 0));
                }
            }

            // ローパスフィルター初期化
            ResetLPF_V1(V1);
        }
예제 #2
0
        /// <summary>
        /// エリアの移動
        /// </summary>
        private bool MoveAreaCheck()
        {
            // エリアの端に近づいたか?
            if ((R1.X < worldMap.AreaGridSize.w / 4 || R1.X > worldMap.AreaGridSize.w * 3 / 4) ||
                (R1.Y < worldMap.AreaGridSize.h / 4 || R1.Y > worldMap.AreaGridSize.h * 3 / 4))
            {
                lock (AreaBmp)
                {
                    // R1の位置を新しいエリアの中心とする
                    worldMap.UpdateAreaCenter((int)(R1.X + 0.5), (int)(R1.Y + 0.5));

                    // エリアマップ更新
                    AreaBmp = worldMap.AreaGridMap.UpdateBitmap();
                }

                //bAreaMapUpdateReqest = true;
                MRF.SetMap(worldMap.AreaGridMap);
                return(true);
            }
            return(false);
        }
예제 #3
0
        /// <summary>
        /// 自己位置推定  開始位置セット
        /// </summary>
        /// <param name="stWldX">マップ座標X</param>
        /// <param name="stWldY">マップ座標Y</param>
        /// <param name="stDir">角度</param>
        public void SetStartPostion(int stWldX, int stWldY, double stDir)
        {
            MRF = new MapRangeFinder(LRF_Ctrl.LRFmaxRange_mm / MapToRealScale);    // 仮想Map用 LRFクラス

            worldMap.UpdateAreaCenter(stWldX, stWldY);
            AreaBmp = worldMap.AreaGridMap.UpdateBitmap();
            //bAreaMapUpdateReqest = false;

            MRF.SetMap(worldMap.AreaGridMap);

            // ロボットマーカ設定
            R1 = new MarkPoint(stWldX, stWldY, stDir);        // 実ロボット位置 R.E,Compass,GPSでの位置+ LRF補正

            E1 = new MarkPoint(stWldX, stWldY, stDir);        // R.Encoderの位置
            oldE1 = new MarkPoint(stWldX, stWldY, stDir);     //

            E2 = new MarkPoint(stWldX, stWldY, stDir);        // R.E Pluse & Compus の位置

            V1 = new MarkPoint(stWldX, stWldY, stDir);        // 推定位置ロボット
            C1 = new MarkPoint(0, 0, stDir);
            G1 = new MarkPoint(0, 0, 0);        // GPS
            oldG1 = new MarkPoint(stWldX, stWldY, stDir);     //

            // パーティクルフィルター初期化
            {
                // サンプル数(ParticleSizeと同じで、すべてのパーティクルを対象とする)
                // LRFの有効距離を半径に変換(/2.0)、20%の距離で散らばる
                // +-5度の範囲
                ParticleFilter = new ParticleFilter(ParticleSize, (((LRF_Ctrl.LRFmaxRange_mm / 2.0) * 0.20) / MapToRealScale), 30.0 );        // サンプリング数、パーティクルのレンジ

                Particles = new List<Particle>();
                for (int i = 0; i < ParticleSize; ++i)
                {
                    // パーティクルマーカー
                    Particles.Add(new Particle(new MarkPoint(0,0,0), 0));
                }
            }

            // ローパスフィルター初期化
            ResetLPF_V1(V1);
        }