snake.h 5.97 KB
Newer Older
1 2 3 4 5 6 7 8
#pragma once

#include <vector>
#include <string>
#include <array>

#include "snake_geometry.h"

9 10 11 12
#include "ortools/constraint_solver/routing.h"
#include "ortools/constraint_solver/routing_enums.pb.h"
#include "ortools/constraint_solver/routing_index_manager.h"
#include "ortools/constraint_solver/routing_parameters.h"
Valentin Platzgummer's avatar
Valentin Platzgummer committed
13

14
using namespace std;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
15
using namespace snake_geometry;
16

Valentin Platzgummer's avatar
Valentin Platzgummer committed
17 18
using namespace operations_research;

19 20 21 22
namespace snake {

    enum AreaType {MeasurementArea, ServiceArea, Corridor};

23 24 25 26 27 28
    class Area {
    public:
        Area();
        Area(const GeoPoint2DList &gP, AreaType tp);
        Area(const GeoPoint2DList &gP, double alt, size_t l, AreaType tp);

Valentin Platzgummer's avatar
Valentin Platzgummer committed
29
        GeoPoint2DList      geoPolygon;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
30 31 32
        double              altitude;
        size_t              layers;
        AreaType            type;
33 34
    };

Valentin Platzgummer's avatar
Valentin Platzgummer committed
35 36 37
    //========================================================================================
    // Scenario
    //========================================================================================
38 39 40 41
    class Scenario{
    public:
        Scenario();

Valentin Platzgummer's avatar
Valentin Platzgummer committed
42
        bool addArea(Area &area);
43

Valentin Platzgummer's avatar
Valentin Platzgummer committed
44 45 46 47 48 49 50 51 52 53 54
        const Area &getMeasurementArea() const {return _measurementArea;}
        const Area &getServiceArea() const {return _serviceArea;}
        const Area &getCorridor() const {return _corridor;}

        const BoostPolygon &getMeasurementAreaENU() {return _measurementAreaENU;}
        const BoostPolygon &getServiceAreaENU()     {return _serviceAreaENU;}
        const BoostPolygon &getCorridorENU()        {return _corridorENU;}
        const BoostPolygon &getJoineAreaENU()       {return _joinedAreaENU;}
        const GeoPoint3D   &getOrigin()             {return _geoOrigin;}

        const vector<BoostPolygon> &getTilesENU()               {return _tilesENU;}
Valentin Platzgummer's avatar
Valentin Platzgummer committed
55
        const BoostLineString      &getTileCenterPointsENU()    {return _tileCenterPointsENU;}
Valentin Platzgummer's avatar
Valentin Platzgummer committed
56 57
        const min_bbox_rt          &getMeasurementAreaBBoxENU() {return _mAreaBoundingBox;}
        const BoostPoint           &getHomePositonENU()         {return _homePositionENU;}
58

59 60 61 62
        const vector<GeoPoint3DList>    &getTiles()               {return _tiles;}
        const vector<GeoPoint3D>        &getTileCenterPoints()    {return _tileCenterPoints;}
        const GeoPoint3D                &getHomePositon()         {return _homePosition;}

63 64
        bool defined(double tileWidth, double tileHeight, double minTileArea);

Valentin Platzgummer's avatar
Valentin Platzgummer committed
65 66
        string errorString;

67 68 69 70 71 72
    private:
        bool _areas2enu();
        bool _setMeasurementArea(Area &area);
        bool _setServiceArea(Area &area);
        bool _setCorridor(Area &area);
        bool _calculateBoundingBox();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
73
        bool _calculateTiles(double tileWidth, double tileHeight, double minTileArea);
74 75 76 77 78 79
        bool _calculateJoinedArea();

        Area _measurementArea;
        Area _serviceArea;
        Area _corridor;

Valentin Platzgummer's avatar
Valentin Platzgummer committed
80 81 82 83
        BoostPolygon _measurementAreaENU;
        BoostPolygon _serviceAreaENU;
        BoostPolygon _corridorENU;
        BoostPolygon _joinedAreaENU;
84

Valentin Platzgummer's avatar
Valentin Platzgummer committed
85 86
        min_bbox_rt _mAreaBoundingBox;

Valentin Platzgummer's avatar
Valentin Platzgummer committed
87
        vector<BoostPolygon>    _tilesENU;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
88
        BoostLineString         _tileCenterPointsENU;
89

90 91 92
        vector<GeoPoint3DList>    _tiles;
        vector<GeoPoint3D>        _tileCenterPoints;

93
        GeoPoint3D _geoOrigin;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
94
        BoostPoint _homePositionENU;
95 96

        GeoPoint3D _homePosition;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
97 98 99 100 101
    };

    //========================================================================================
    // FlightPlan
    //========================================================================================
102

Valentin Platzgummer's avatar
Valentin Platzgummer committed
103 104 105
    class FlightPlan{
    public:
        FlightPlan();
106

Valentin Platzgummer's avatar
Valentin Platzgummer committed
107 108 109
        void setScenario(const Scenario &scenario)          {_scenario = scenario;}
        void setProgress(const vector<int8_t> &progress)    {_progress = progress;}

Valentin Platzgummer's avatar
Valentin Platzgummer committed
110 111 112 113 114
        const Scenario          &getScenario(void)          const {return _scenario;}
        const BoostLineString   &getWaypointsENU(void)      const {return _waypointsENU;}
        const GeoPoint2DList    &getWaypoints(void)         const {return _waypoints;}
        const vector<uint64_t>  &getArrivalPathIdx(void)    const {return _arrivalPathIdx;}
        const vector<uint64_t>  &getReturnPathIdx(void)     const {return _returnPathIdx;}
Valentin Platzgummer's avatar
Valentin Platzgummer committed
115
#ifndef NDEBUG
Valentin Platzgummer's avatar
Valentin Platzgummer committed
116
        const BoostLineString   &getPathVertices(void)      const {return _PathVertices;}
Valentin Platzgummer's avatar
Valentin Platzgummer committed
117
#endif
Valentin Platzgummer's avatar
Valentin Platzgummer committed
118

119 120
        bool                            generate(double lineDistance, double minTransectLength);
        const vector<BoostLineString>  &getTransects() const {return _transects;}
Valentin Platzgummer's avatar
Valentin Platzgummer committed
121 122 123 124

        string errorString;

    private:
Valentin Platzgummer's avatar
Valentin Platzgummer committed
125 126 127 128 129 130 131 132 133 134 135 136
        // Search Filter to speed up routing.SolveWithParameters(...);
        // Found here: http://www.lia.disi.unibo.it/Staff/MicheleLombardi/or-tools-doc/user_manual/manual/ls/ls_filtering.html
        class SearchFilter : public LocalSearchFilter{

        };

        typedef struct{
            Matrix<int64_t>                 distanceMatrix;
            long                            numVehicles;
            RoutingIndexManager::NodeIndex  depot;
        }RoutingDataModel_t;

Valentin Platzgummer's avatar
Valentin Platzgummer committed
137
        bool _generateTransects(double lineDistance, double minTransectLength);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
138 139 140 141 142 143
        void _generateRoutingModel(const BoostLineString &vertices,
                                   const BoostPolygon &polygonOffset,
                                   size_t n0,
                                   RoutingDataModel_t &dataModel,
                                   Matrix<double> &graph);

Valentin Platzgummer's avatar
Valentin Platzgummer committed
144
        Scenario                                _scenario;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
145
        BoostLineString                         _waypointsENU;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
146
        GeoPoint2DList                          _waypoints;
147
        vector<BoostLineString>                 _transects;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
148
        vector<int8_t>                          _progress;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
149 150
        vector<uint64_t>                        _arrivalPathIdx;
        vector<uint64_t>                        _returnPathIdx;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
151 152 153 154

#ifndef NDEBUG
        BoostLineString                         _PathVertices;
#endif
155
    };
Valentin Platzgummer's avatar
Valentin Platzgummer committed
156 157

    namespace detail {
158
        const double offsetConstant = 0.1; // meter, polygon offset to compenstate for numerical inaccurracies.
Valentin Platzgummer's avatar
Valentin Platzgummer committed
159
    }
160 161
}