Loading...
Searching...
No Matches
ThunderLightning.cpp
1/*********************************************************************
2* Software License Agreement (BSD License)
3*
4* Copyright (c) 2015, Rice University
5* All rights reserved.
6*
7* Redistribution and use in source and binary forms, with or without
8* modification, are permitted provided that the following conditions
9* are met:
10*
11* * Redistributions of source code must retain the above copyright
12* notice, this list of conditions and the following disclaimer.
13* * Redistributions in binary form must reproduce the above
14* copyright notice, this list of conditions and the following
15* disclaimer in the documentation and/or other materials provided
16* with the distribution.
17* * Neither the name of the Rice University nor the names of its
18* contributors may be used to endorse or promote products derived
19* from this software without specific prior written permission.
20*
21* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32* POSSIBILITY OF SUCH DAMAGE.
33*********************************************************************/
34
35/* Author: Mark Moll, Dave Coleman, Ioan Sucan */
36
37#include <ompl/base/spaces/RealVectorStateSpace.h>
38#include <ompl/tools/thunder/Thunder.h>
39#include <ompl/tools/lightning/Lightning.h>
40#include <ompl/util/PPM.h>
41
42#include <ompl/config.h>
43
44#include <boost/filesystem.hpp>
45#include <iostream>
46
47namespace ob = ompl::base;
48namespace og = ompl::geometric;
49namespace ot = ompl::tools;
50
51class Plane2DEnvironment
52{
53public:
54
55 Plane2DEnvironment(const char *ppm_file, bool useThunder = true)
56 {
57 bool ok = false;
58 try
59 {
60 ppm_.loadFile(ppm_file);
61 ok = true;
62 }
63 catch(ompl::Exception &ex)
64 {
65 OMPL_ERROR("Unable to load %s.\n%s", ppm_file, ex.what());
66 }
67 if (ok)
68 {
69 auto space(std::make_shared<ob::RealVectorStateSpace>());
70 space->addDimension(0.0, ppm_.getWidth());
71 space->addDimension(0.0, ppm_.getHeight());
72 maxWidth_ = ppm_.getWidth() - 1;
73 maxHeight_ = ppm_.getHeight() - 1;
74 if (useThunder)
75 {
76 expPlanner_ = std::make_shared<ot::Thunder>(space);
77 expPlanner_->setFilePath("thunder.db");
78 }
79 else
80 {
81 expPlanner_ = std::make_shared<ot::Lightning>(space);
82 expPlanner_->setFilePath("lightning.db");
83 }
84 // set state validity checking for this space
85 expPlanner_->setStateValidityChecker([this](const ob::State *state)
86 { return isStateValid(state); });
87 space->setup();
88 expPlanner_->getSpaceInformation()->setStateValidityCheckingResolution(1.0 / space->getMaximumExtent());
89 vss_ = expPlanner_->getSpaceInformation()->allocValidStateSampler();
90
91 // DTC
92 //experience_setup_->setPlanner(std::make_shared<og::RRTConnect>(si_));
93 // Set the repair planner
94 // experience_setup_->setRepairPlanner(std::make_shared<og::RRTConnect>(si_));
95 }
96 }
97
98 ~Plane2DEnvironment()
99 {
100 expPlanner_->save();
101 }
102
103 bool plan()
104 {
105 std::cout << std::endl;
106 std::cout << "-------------------------------------------------------" << std::endl;
107 std::cout << "-------------------------------------------------------" << std::endl;
108
109 if (!expPlanner_)
110 {
111 OMPL_ERROR("Simple setup not loaded");
112 return false;
113 }
114 expPlanner_->clear();
115
116 ob::ScopedState<> start(expPlanner_->getStateSpace());
117 vss_->sample(start.get());
118 ob::ScopedState<> goal(expPlanner_->getStateSpace());
119 vss_->sample(goal.get());
120 expPlanner_->setStartAndGoalStates(start, goal);
121
122 bool solved = expPlanner_->solve(10.);
123 if (solved)
124 OMPL_INFORM("Found solution in %g seconds",
125 expPlanner_->getLastPlanComputationTime());
126 else
127 OMPL_INFORM("No solution found");
128
129 expPlanner_->doPostProcessing();
130
131 return false;
132 }
133
134private:
135
136 bool isStateValid(const ob::State *state) const
137 {
138 const int w = std::min((int)state->as<ob::RealVectorStateSpace::StateType>()->values[0], maxWidth_);
139 const int h = std::min((int)state->as<ob::RealVectorStateSpace::StateType>()->values[1], maxHeight_);
140
141 const ompl::PPM::Color &c = ppm_.getPixel(h, w);
142 return c.red > 127 && c.green > 127 && c.blue > 127;
143 }
144
145 ot::ExperienceSetupPtr expPlanner_;
146 ob::ValidStateSamplerPtr vss_;
147 int maxWidth_;
148 int maxHeight_;
149 ompl::PPM ppm_;
150};
151
152int main(int argc, char **)
153{
154 std::cout << "OMPL version: " << OMPL_VERSION << std::endl;
155
156 boost::filesystem::path path(TEST_RESOURCES_DIR);
157 Plane2DEnvironment env((path / "ppm" / "floor.ppm").string().c_str(), argc==1);
158
159 for (unsigned int i = 0; i < 100; ++i)
160 env.plan();
161
162 return 0;
163}
The exception type for ompl.
Definition: Exception.h:47
Load and save .ppm files - "portable pixmap format" an image file formats designed to be easily excha...
Definition: PPM.h:47
Definition of a scoped state.
Definition: ScopedState.h:57
Definition of an abstract state.
Definition: State.h:50
const T * as() const
Cast this instance to a desired type.
Definition: State.h:66
#define OMPL_INFORM(fmt,...)
Log a formatted information string.
Definition: Console.h:68
#define OMPL_ERROR(fmt,...)
Log a formatted error string.
Definition: Console.h:64
This namespace contains sampling based planning routines shared by both planning under geometric cons...
This namespace contains code that is specific to planning under geometric constraints.
Definition: GeneticSearch.h:48
Includes various tools such as self config, benchmarking, etc.