void Awake()
    {
        // connect to the outer data
        labyrinth = GameObject.FindGameObjectWithTag("Labyrinth").GetComponent<LabyrinthController>();
        walls = labyrinth.GetMap();
        minimap = GameObject.FindGameObjectWithTag("Minimap").GetComponent<MinimapController>();

        // connect to subsystems
        laser = GetComponent<DroidLaser>();

        // create first particles, for 3*3 for each unit
        var length = labyrinth.length;
        var width = labyrinth.width;
        var particlesOnUnit = 1;
        var particlesShift = CreateParticlesShift(particlesOnUnit);
        var ls = new List<Particle>();
        for (var i = 0; i < length; i++)
        {
            for (var j = 0; j < width; j++)
            {
                if (walls[i, j] == 0)
                {
                    // nine particles for every unit
                    for (var k = 0; k < particlesOnUnit*particlesOnUnit; k++)
                    {
                        var particle = new Particle
                        {
                            probablity = 1,
                            position = new Vector3(i, 1f, j) + particlesShift[k]
                        };
                        ls.Add(particle);
                    }
                }
            }
        }

        // create particles map
        particlesMap = new ParticlesMap(ls);
        particlesMap.Normalize();
        StartCoroutine(minimap.ShowParticles(particlesMap.Particles));
    }
    private void WeightParticles()
    {
        var data = laser.Scan();
        var pBest = new Particle();
        foreach (var p in particlesMap.Particles)
        {
            var convolution = LaserHelper.ScanPoint(p.position)*data;
            //p.direction = (int)convolution.topPosition;

            p.probablity = CalculateProbabilityOnProductResult(convolution);
            if (p.probablity > pBest.probablity)
            {
                pBest = p;
            }
        }
    }