コード例 #1
0
ファイル: ObstacleGrid.cs プロジェクト: Pedrous/AutonomousCar
        private void buildDistanceFieldBitmap(GraphicsDevice device)
        {
            distanceFieldBitmap = new Texture2D(device, NumColumns, NumRows);
            Color[] distance = new Color[NumColumns * NumRows];

            for (int c = 0; c < NumColumns; c++)
            {
                for (int r = 0; r < NumRows; r++)
                {
                    float val = GVD.GetObstacleDistance(c, r);
                    if (val == 0f)
                    {
                        distance[c + r * NumColumns] = Color.Red;
                    }
                    //else if (GVD.GetVoronoiDistance(new GridCell(c, r)) == 0f)
                    //distance[c + r * NumColumns] = Color.White;
                    else
                    {
                        val /= 32;
                        //val = 255;
                        distance[c + r * NumColumns] = new Color(val, val, val);
                    }
                }
            }

            distanceFieldBitmap.SetData <Color>(distance);
        }
コード例 #2
0
ファイル: ObstacleGrid.cs プロジェクト: Pedrous/AutonomousCar
        public void RemoveObstacle(int obstacleId)
        {
            LinkedList <GridCell> cells;

            if (!Obstacles.Find(ref obstacleId, out cells))
            {
                return;
            }

            foreach (GridCell cell in cells)
            {
                GVD.UnsetObstacle(cell);
                OccupiedCells[cell.C, cell.R]--;
            }
        }
コード例 #3
0
ファイル: ObstacleGrid.cs プロジェクト: Pedrous/AutonomousCar
        private void buildVoronoiFieldBitmap(GraphicsDevice device)
        {
            voronoiFieldBitmap = new Texture2D(device, NumColumns, NumRows);

            Color[] voro = new Color[NumColumns * NumRows];

            for (int c = 0; c < NumColumns; c++)
            {
                for (int r = 0; r < NumRows; r++)
                {
                    float val = GVD.GetPathCost(c, r);
                    voro[c + r * NumColumns] = new Color(Vector3.One - new Color(val, val, val).ToVector3());
                }
            }

            voronoiFieldBitmap.SetData <Color>(voro);
        }
コード例 #4
0
ファイル: ObstacleGrid.cs プロジェクト: Pedrous/AutonomousCar
        public bool IsSafe(Pose pose, float safetyFactor)
        {
            Vector2  pos     = Car.GetCenterPosition(pose);
            GridCell cellPos = PointToCellPosition(pos);

            if (cellPos == GridCell.Unknown)
            {
                return(false);
            }

            float obstDist = GVD.GetObstacleDistance(cellPos);

            //if (obstDist > Car.SAFE_RADIUS * safetyFactor + DiagonalResolution)
            //return true;

            GridCell          nearestObstCell = GVD.GetNearestObstacle(cellPos);
            LinkedList <Body> obstacles       = ObstaclesByCell[nearestObstCell.C, nearestObstCell.R];

            PolygonShape carShape = new PolygonShape(1f);
            Transform    carXform = new Transform();

            carShape.SetAsBox(Car.HALF_CAR_LENGTH * safetyFactor, Car.HALF_CAR_WIDTH * safetyFactor);
            carXform.Set(pos, pose.Orientation);

            foreach (Body obs in obstacles)
            {
                Transform obstXform;
                obs.GetTransform(out obstXform);
                if (obs.FixtureList != null && AABB.TestOverlap(carShape, 0, obs.FixtureList[0].Shape, 0, ref carXform, ref obstXform))
                {
                    return(false);
                }
            }

            return(true);
        }
コード例 #5
0
ファイル: ObstacleGrid.cs プロジェクト: Pedrous/AutonomousCar
        private void addBodyToGrid(Body body, int obstacleId)
        {
            BodyList.Add(body);
            Vertices vertices = ((PolygonShape)body.FixtureList[0].Shape).Vertices;

            for (int i = 0; i < vertices.Count; i++)
            {
                int to = i == vertices.Count - 1 ? 0 : i + 1;
                foreach (GridCell cell in rasterizeLine(body.GetWorldPoint(vertices[i]), body.GetWorldPoint(vertices[to])))
                {
                    Obstacles[obstacleId].Add(cell);
                    GVD.SetObstacle(cell, obstacleId);
                    OccupiedCells[cell.C, cell.R]++;

                    LinkedList <Body> obs = ObstaclesByCell[cell.C, cell.R];
                    if (obs == null)
                    {
                        obs = ObstaclesByCell[cell.C, cell.R] = new LinkedList <Body>();
                    }

                    obs.Add(body);
                }
            }
        }
コード例 #6
0
ファイル: ObstacleGrid.cs プロジェクト: Pedrous/AutonomousCar
 public void BuildGVD()
 {
     GVD.Update();
     distanceFieldBitmap = null;
     voronoiFieldBitmap  = null;
 }
コード例 #7
0
ファイル: ObstacleGrid.cs プロジェクト: Pedrous/AutonomousCar
 public Vector2 GetNearestObstacleCellLocation(Vector2 pos)
 {
     return(CellPositionToPoint(GVD.GetNearestObstacle(PointToCellPosition(pos))) + new Vector2(HalfResolution));
 }
コード例 #8
0
ファイル: ObstacleGrid.cs プロジェクト: Pedrous/AutonomousCar
 public void UpdateVoronoiFieldParameters(float alpha, float dmax)
 {
     GVD.UpdatePathCostParameters(alpha, dmax);
     voronoiFieldBitmap = null;
 }