Parasol Planning Library (PPL)
Environment.h
Go to the documentation of this file.
1 #ifndef PMPL_ENVIRONMENT_H_
2 #define PMPL_ENVIRONMENT_H_
3 
6 #include "Utilities/MPUtils.h"
7 
8 #include "Transformation.h"
9 #include "glutils/color.h"
10 
11 #include <iostream>
12 #include <map>
13 #include <memory>
14 #include <string>
15 #include <vector>
16 #include <unordered_map>
17 
19 class MultiBody;
20 
21 class Robot;
23 class XMLNode;
24 
25 
29 class Terrain {
30 
31  public:
32 
35 
36  enum Axis {X, Y, Z};
37 
39 
42 
44 
45  Terrain(XMLNode& _node);
46 
47  Terrain(const Terrain& _terrain);
48 
52 
53  Terrain& operator=(const Terrain& _terrain);
54 
57 
59  const glutils::color& Color() const noexcept;
60 
62  Boundary* GetBoundary() const noexcept;
63 
65  const std::vector<std::unique_ptr<Boundary>>& GetBoundaries() const noexcept;
66 
68  double GetPerimeter();
69 
73  bool InTerrain(const Point3d _p) const noexcept;
74 
75 
79  bool InTerrain(const Cfg _cfg) const noexcept;
80 
84  bool IsNeighbor(const Terrain& _terrain);
85 
88  bool IsVirtual() const noexcept;
89 
92  bool IsWired() const noexcept;
93 
95 
96  private:
99 
105  bool IsTouching(Boundary* _bound1, Boundary* _bound2, Axis& _type);
106 
111  double Overlap(Boundary* _b1, Boundary* _b2);
112 
116 
117  glutils::color m_color{glutils::color::green};
118  std::unique_ptr<Boundary> m_boundary;
119 
120  std::vector<std::unique_ptr<Boundary>> m_boundaries;
121 
122  bool m_virtual{false};
124 
127  bool m_wire{true};
128 
130 };
131 
132 
137 class Environment {
138 
139  public:
140 
143 
144  typedef std::unordered_map<std::string, std::vector<Terrain>>
146 
150 
152 
153  explicit Environment(XMLNode& _node);
154 
155  Environment(const Environment& _other);
157 
158  virtual ~Environment();
159 
163 
164  Environment& operator=(const Environment& _other);
166 
170 
172  const std::string& GetEnvFileName() const noexcept;
173 
175  void ReadXMLOptions(XMLNode& _node);
176 
178  void ReadXML(XMLNode& _node);
179 
185  void Read(std::string _filename);
186 
189  void Print(std::ostream& _os) const;
190 
193  void Write(std::ostream& _os);
194 
198 
201  void ComputeResolution(const std::vector<std::unique_ptr<Robot>>& _robots);
202 
204  double GetPositionRes() const noexcept;
206  void SetPositionRes(double _res) noexcept;
207 
209  double GetOrientationRes() const noexcept;
211  void SetOrientationRes(double _res) noexcept;
212 
214  double GetTimeRes() const noexcept;
215 
219 
221  Boundary* GetBoundary() const noexcept;
222 
225  void SetBoundary(std::unique_ptr<Boundary>&& _b) noexcept;
226 
230 
232  size_t NumObstacles() const noexcept;
233 
237  MultiBody* GetObstacle(size_t _index) const;
238 
241  MultiBody* GetRandomObstacle() const;
242 
248  size_t AddObstacle(const std::string& _dir, const std::string& _filename,
249  const mathtool::Transformation& _t = mathtool::Transformation());
250 
253  void RemoveObstacle(const size_t _position);
254 
257  void RemoveObstacle(MultiBody* const _obst);
258 
261  std::map<mathtool::Vector3d, std::vector<size_t>> ComputeObstacleVertexMap()
262  const;
263 
265  bool UsingBoundaryObstacle() const noexcept;
266 
270 
272  double GetFrictionCoefficient() const noexcept;
273 
275  const mathtool::Vector3d& GetGravity() const noexcept;
276 
280 
282  const TerrainMap& GetTerrains() const noexcept;
283 
287 
289  const mathtool::Transformation& GetInitialCameraTransformation() const
290  noexcept;
291 
293 
299  bool IsolateTerrain(Cfg start, Cfg goal);
300 
305  bool SameTerrain(Cfg _start, Cfg _goal);
306 
308  void RestoreBoundary();
309 
311  void SaveBoundary();
312 
313  std::unique_ptr<Boundary> m_originalBoundary;
315 
316  protected:
317 
320 
324  void InitializeBoundary(std::string _type, const std::string _where);
325 
327  void CreateBoundaryObstacle();
328 
332 
333  std::string m_filename;
334  std::string m_modelDataDir;
335 
339 
340  double m_positionRes{-1.};
341  double m_orientationRes{.05};
342  double m_timeRes{.05};
343 
347 
348  std::unique_ptr<Boundary> m_boundary;
349  std::vector<std::unique_ptr<MultiBody>> m_obstacles;
350  bool m_boundaryObstacle{false};
351 
355 
357  mathtool::Vector3d m_gravity;
358 
362 
364 
368 
369  mathtool::Transformation m_initialCameraTransform;
370 
372 
373 };
374 
375 #endif
Definition: Boundary.h:30
Definition: Cfg.h:38
Definition: CollisionDetectionMethod.h:19
Definition: Environment.h:137
Environment(Environment &&_other)
Move.
mathtool::Transformation m_initialCameraTransform
Camera starts here.
Definition: Environment.h:369
Environment & operator=(const Environment &_other)
Copy.
Definition: Environment.cpp:299
double m_orientationRes
Rotational resolution of movement.
Definition: Environment.h:341
double m_positionRes
Positional resolution of movement.
Definition: Environment.h:340
std::string m_filename
Which file did this environment come from?
Definition: Environment.h:333
const std::string & GetEnvFileName() const noexcept
Get the environment file name.
Definition: Environment.cpp:332
std::string m_modelDataDir
Directory where environment file is located.
Definition: Environment.h:334
void Read(std::string _filename)
Definition: Environment.cpp:423
std::unique_ptr< Boundary > m_boundary
Workspace boundary.
Definition: Environment.h:348
void ReadXML(XMLNode &_node)
Parse XML environment file.
Definition: Environment.cpp:397
const mathtool::Transformation & GetInitialCameraTransformation() const noexcept
Get the initial transformation for the camera.
Definition: Environment.cpp:769
void InitializeBoundary(std::string _type, const std::string _where)
Definition: Environment.cpp:777
double GetTimeRes() const noexcept
Get the time resolution.
Definition: Environment.cpp:614
bool UsingBoundaryObstacle() const noexcept
Check if the boundary is also modeled as an obstacle.
Definition: Environment.cpp:737
void SetOrientationRes(double _res) noexcept
Set the orientation resolution.
Definition: Environment.cpp:607
std::unordered_map< std::string, std::vector< Terrain > > TerrainMap
Definition: Environment.h:145
void Write(std::ostream &_os)
Definition: Environment.cpp:506
size_t AddObstacle(const std::string &_dir, const std::string &_filename, const mathtool::Transformation &_t=mathtool::Transformation())
Definition: Environment.cpp:664
size_t NumObstacles() const noexcept
Get the number of MultiBodies.
Definition: Environment.cpp:637
bool m_boundaryObstacle
Use the boundary as an obstacle?
Definition: Environment.h:350
bool SameTerrain(Cfg _start, Cfg _goal)
Definition: Environment.cpp:847
void Print(std::ostream &_os) const
Definition: Environment.cpp:488
virtual ~Environment()
mathtool::Vector3d m_gravity
The gravity direction and magnitude.
Definition: Environment.h:357
MultiBody * GetObstacle(size_t _index) const
Definition: Environment.cpp:644
double m_timeRes
Resolution for time.
Definition: Environment.h:342
void RestoreBoundary()
Restores original boundary.
Definition: Environment.cpp:860
double GetOrientationRes() const noexcept
Get the orientation resolution.
Definition: Environment.cpp:600
std::unique_ptr< Boundary > m_originalBoundary
Definition: Environment.h:313
std::map< mathtool::Vector3d, std::vector< size_t > > ComputeObstacleVertexMap() const
Definition: Environment.cpp:718
Environment & operator=(Environment &&_other)
Move.
std::vector< std::unique_ptr< MultiBody > > m_obstacles
Obstacle multibodies.
Definition: Environment.h:349
void RemoveObstacle(const size_t _position)
Definition: Environment.cpp:689
const TerrainMap & GetTerrains() const noexcept
Get environment terrains.
Definition: Environment.cpp:761
double GetFrictionCoefficient() const noexcept
Get the friction coefficient.
Definition: Environment.cpp:745
Boundary * GetBoundary() const noexcept
Get the single boundary of the environemnt.
Definition: Environment.cpp:622
double m_frictionCoefficient
The uniform friction coefficient.
Definition: Environment.h:356
void ReadXMLOptions(XMLNode &_node)
Parse XML options from the Problem XML node.
Definition: Environment.cpp:339
void CreateBoundaryObstacle()
Create an obstacle for the boundary.
Definition: Environment.cpp:796
bool IsolateTerrain(Cfg start, Cfg goal)
IROS Hacks.
Definition: Environment.cpp:832
void ComputeResolution(const std::vector< std::unique_ptr< Robot >> &_robots)
Definition: Environment.cpp:522
MultiBody * GetRandomObstacle() const
Definition: Environment.cpp:653
TerrainMap m_terrains
Environment terrains.
Definition: Environment.h:363
void SaveBoundary()
Saves boundary as original boundary.
Definition: Environment.cpp:866
void SetBoundary(std::unique_ptr< Boundary > &&_b) noexcept
Definition: Environment.cpp:629
const mathtool::Vector3d & GetGravity() const noexcept
Get the gravity 3-vector.
Definition: Environment.cpp:752
double GetPositionRes() const noexcept
Get the position resolution.
Definition: Environment.cpp:586
void SetPositionRes(double _res) noexcept
Set the position resolution.
Definition: Environment.cpp:593
Definition: MultiBody.h:65
Definition: Robot.h:31
Workspace representation of terrain within the world.
Definition: Environment.h:29
Boundary * GetBoundary() const noexcept
Get the single enclosing boundary of the terrain.
Definition: Environment.cpp:83
Axis
Definition: Environment.h:36
@ Y
Definition: Environment.h:36
@ Z
Definition: Environment.h:36
@ X
Definition: Environment.h:36
Terrain & operator=(const Terrain &_terrain)
Definition: Environment.cpp:59
double GetPerimeter()
Find the perimeter of all the boundaries.
Definition: Environment.cpp:95
bool IsNeighbor(const Terrain &_terrain)
Definition: Environment.cpp:140
const glutils::color & Color() const noexcept
Get the color for visualization.
Definition: Environment.cpp:76
const std::vector< std::unique_ptr< Boundary > > & GetBoundaries() const noexcept
Get the single enclosing boundaries of the terrain.
Definition: Environment.cpp:89
bool IsVirtual() const noexcept
Definition: Environment.cpp:158
bool InTerrain(const Point3d _p) const noexcept
Definition: Environment.cpp:120
bool IsWired() const noexcept
Definition: Environment.cpp:164
Definition: WorkspaceDecomposition.h:24
Definition: XMLNode.h:27
Definition: GMSPolyhedron.h:27
Definition: Cfg.h:23