MIRA
TrajectoryFamilyVisualization.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) by
3  * MetraLabs GmbH (MLAB), GERMANY
4  * and
5  * Neuroinformatics and Cognitive Robotics Labs (NICR) at TU Ilmenau, GERMANY
6  * All rights reserved.
7  *
8  * Redistribution and modification of this code is strictly prohibited.
9  *
10  * IN NO EVENT SHALL "MLAB" OR "NICR" BE LIABLE TO ANY PARTY FOR DIRECT,
11  * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF
12  * THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF "MLAB" OR
13  * "NICR" HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14  *
15  * "MLAB" AND "NICR" SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING,
16  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
17  * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
18  * ON AN "AS IS" BASIS, AND "MLAB" AND "NICR" HAVE NO OBLIGATION TO
19  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR MODIFICATIONS.
20  */
21 
30 #ifndef _MIRA_PILOT_TRAJECTORYFAMILYVISUALIZATION_H_
31 #define _MIRA_PILOT_TRAJECTORYFAMILYVISUALIZATION_H_
32 
33 #include <math/Saturate.h>
34 #include <image/Colormap.h>
35 
37 
40 
41 #include <widgets/OgreUtils.h>
42 
43 #include <pilot/TrajectoryFamily.h>
44 
45 #include <OGRE/OgreSceneManager.h>
46 #include <OGRE/OgreSceneNode.h>
47 #include <OGRE/OgreHardwarePixelBuffer.h>
48 #include <OGRE/OgreTechnique.h>
49 #include <OGRE/OgreMaterialManager.h>
50 #include <OGRE/OgreTextureManager.h>
51 #include <OGRE/OgreManualObject.h>
52 
53 #include <gui/HighlightProperty.h>
54 
55 namespace mira { namespace pilot {
56 
58 
61 {
62  class HighlightProperty : public mira::HighlightProperty
63  {
64  public:
65  HighlightProperty(TrajectoryFamilyVisualizationCommonBase* obj)
67  mDashed(false), mColor2(0.0f, 0.0f, 0.0f, 1.0f) {}
68 
69  template <typename Reflector>
70  void reflect(Reflector& r)
71  {
73 
74  r.property("Dashed", mDashed,
75  setterNotify(mDashed, mNotifyChange),
76  "Show each trajectory sample interval by dashing",
77  false);
78 
79  r.property("Color2", mColor2,
80  setterNotify(mColor2, mNotifyChange),
81  "The second color for drawing the selected trajectory in dashed mode",
82  Ogre::ColourValue(0.0f, 0.0f, 0.0f, 1.0f));
83  }
84 
85  public:
86  bool isDashed() const { return mDashed; }
87  const Ogre::ColourValue& color2() const { return mColor2; }
88 
89  protected:
90  bool mDashed;
91  Ogre::ColourValue mColor2;
92  };
93 
94 public:
96  : mHideAll(false), mHideNotReachable(true), mHideNotAdmissible(true), mZOffset(0.01f),
97  mEndPointMarkerSize(0.01f), mHighlightBest(true),
98  mHighlight(this),
100  mText(NULL),
101  mVisualization(visualization)
102  {
103  }
104 
106 
107  template <typename Reflector>
108  void reflect(Reflector& r)
109  {
110  r.property("Hide all", mHideAll,
112  "Hide all trajectories (except highlight)", false);
113  r.property("Hide not reachable", mHideNotReachable,
115  "Hide unreachable trajectories", true);
116  r.property("Hide not admissible", mHideNotAdmissible,
118  "Hide not admissible trajectories", true);
119  r.property("ZOffset", mZOffset,
121  "Raise trajectories above map", 0.f);
122  r.property("EndPoint Marker Size", mEndPointMarkerSize,
124  "Size of marker for trajectory end point (improve visibility of trajectory swarm)", 0.01f,
126  r.property("HighlightBest", mHighlightBest,
128  "Highlight the best trajectory (manual highlight selection takes preference, if active)", true);
129  r.property("Highlight", mHighlight,
130  "Select a single trajectory to highlight", HighlightProperty(this));
131  }
132 
133 protected:
134  void setupScene(Ogre::SceneManager* mgr, Ogre::SceneNode* node, std::string name);
135 
136  void renderTrajectory(const robot::PoseVelocityTrajectory& t, const Ogre::ColourValue& color);
137 
138  void redraw() { drawLast(); }
139 
141  virtual void drawLast() = 0;
142 
143 protected:
144  bool mHideAll;
147  float mZOffset;
150  Ogre::ManualObject* mManualObject;
151  HighlightProperty mHighlight;
155 };
156 
158 
159 namespace detail {
160 
163 template<typename Trajectory,
166 {
167  static const TrajectoryInfo& derefIfNeeded(const Trajectory& t) { return t; }
168 };
169 
171 template<typename Trajectory>
172 struct TrajectoryAccessHelper<Trajectory, true>
173 {
174  static const TrajectoryInfo& derefIfNeeded(const Trajectory& t) { return *t; }
175 };
176 
177 }
178 
180 
181 template <typename Trajectory = TrajectoryInfo>
183 {
184 public:
187  {
188  }
189 
191 
192 protected:
193  void drawFamily(const std::vector<Trajectory>& f);
194 
196  virtual Ogre::ColourValue getColor(const Trajectory& t) = 0;
197 
198  void markTrajectory(LineStripObject* line, const Trajectory& t,
199  const Ogre::ColourValue& color,
200  const Ogre::ColourValue& color2);
201 
203  virtual void displayData(const Trajectory& t);
204 };
205 
207 
208 template <typename Trajectory>
209 void TrajectoryFamilyVisualizationBase<Trajectory>::drawFamily(const std::vector<Trajectory>& f)
210 {
211  double minCost = std::numeric_limits<double>::max();
212  const Trajectory* bestTrajectory = nullptr;
213 
214  if (!mHighlight.isEnabled() && mHighlightBest) {
215  foreach (const Trajectory& t, f)
216  {
219  if ((permit == Objective::Permit::ADMISSIBLE) && (cost < minCost)) {
220  minCost = cost;
221  bestTrajectory = &t;
222  }
223  }
224  }
225 
226  mManualObject->clear();
227  if (!mHideAll) {
228  mManualObject->begin("NoLight", Ogre::RenderOperation::OT_LINE_LIST);
229 
230  foreach (const Trajectory& t, f)
231  {
232  Ogre::ColourValue c = getColor(t);
233 
234  if (c.a <= 0.f)
235  continue;
236 
237  renderTrajectory(detail::TrajectoryAccessHelper<Trajectory>::derefIfNeeded(t).trajectory, c);
238 
239  if (mEndPointMarkerSize <= 0.f)
240  continue;
241 
243  if (traj.empty())
244  continue;
245 
246  const auto& p = traj.back().p.t;
247  for (float angle = 0; angle < deg2rad(360.0); angle += deg2rad(10.0))
248  {
249  mManualObject->position(Ogre::Vector3(p.x() + cos(angle) * mEndPointMarkerSize,
250  p.y() + sin(angle) * mEndPointMarkerSize, mZOffset));
251  mManualObject->colour(c);
252  mManualObject->position(Ogre::Vector3(p.x() + cos(angle + deg2rad(10.0)) * mEndPointMarkerSize,
253  p.y() + sin(angle + deg2rad(10.0)) * mEndPointMarkerSize, mZOffset));
254  mManualObject->colour(c);
255  }
256  }
257 
258  mManualObject->end();
259  }
260 
261  mHighlight.setWrapIndex(f.size());
262 
263  if (mHighlight.isEnabled() && f.size())
264  {
265  markTrajectory(mHighlightedTrajectory, f[mHighlight.index()], mHighlight.color(),
266  mHighlight.isDashed() ? mHighlight.color2() : mHighlight.color());
267  displayData(f[mHighlight.index()]);
268  }
269  else if (mHighlightBest && (bestTrajectory != nullptr))
270  {
271  markTrajectory(mHighlightedTrajectory, *bestTrajectory, mHighlight.color(),
272  mHighlight.isDashed() ? mHighlight.color2() : mHighlight.color());
273  displayData(*bestTrajectory);
274  }
275  else
276  {
277  mHighlightedTrajectory->setVisible(false);
278  mText->setVisible(false);
279  }
280 }
281 
282 template <typename Trajectory>
284  const Ogre::ColourValue& color,
285  const Ogre::ColourValue& color2)
286 {
287  if(!line)
288  return;
289 
290  line->clear();
291  line->begin();
292 
293  Ogre::Vector3 p1(0.0f, 0.0f, 0.0f);
294  foreach (const robot::PoseVelocityTrajectorySample& s,
296  Ogre::Vector3 p2(s.p.t.x(), s.p.t.y(), mZOffset);
297  line->point(p1, color);
298  line->point(p2, color2);
299  p1=p2;
300  }
301 
302  line->end();
303  line->setVisible(mVisualization->isEnabled());
304 }
305 
306 template <typename Trajectory>
308 {
309  mText->setCharacterHeight(mHighlight.textsize());
310  mText->setColor(mHighlight.color());
311  mText->setVisible(mVisualization->isEnabled());
312 
313  std::stringstream ss;
315  ss << "velocity= " << v.x() << ", " << rad2deg(v.phi()) << "deg" << std::endl;
318  {
319  case Objective::Permit::ADMISSIBLE : ss << "\npermit=Admissible";
320  break;
321  case Objective::Permit::NOT_ADMISSIBLE : ss << "\npermit=NotAdmissible";
322  break;
323  case Objective::Permit::NOT_REACHABLE : ss << "\npermit=NotReachable";
324  break;
325  default : ss << "\npermit=Unknown";
326  break;
327  }
328 
329  mText->setCaption(ss.str());
330 }
331 
333 
334 }} // namespace
335 
336 #endif
INTERNAL std::enable_if< std::is_floating_point< T >::value, T >::type deg2rad(T value)
TextObject * mText
Definition: TrajectoryFamilyVisualization.h:153
virtual void setVisible(bool visible, bool cascade=true)
bool mHideNotReachable
Definition: TrajectoryFamilyVisualization.h:145
void renderTrajectory(const robot::PoseVelocityTrajectory &t, const Ogre::ColourValue &color)
std::vector< PoseVelocityTrajectorySample, Eigen::aligned_allocator< PoseVelocityTrajectorySample > > PoseVelocityTrajectory
virtual void drawLast()=0
overwrite in subclass to call drawFamily() with current data
virtual ~TrajectoryFamilyVisualizationBase()
Definition: TrajectoryFamilyVisualization.h:190
void setupScene(Ogre::SceneManager *mgr, Ogre::SceneNode *node, std::string name)
#define MIRA_REFLECT_BASE(reflector, BaseClass)
Objective::Permit permit
Definition: TrajectoryFamily.h:68
Information on a single trajectory such as the velocities (given as distances within the time interva...
Definition: TrajectoryFamily.h:48
virtual void displayData(const Trajectory &t)
overwrite this in subclass to show different/additional data
Definition: TrajectoryFamilyVisualization.h:307
void markTrajectory(LineStripObject *line, const Trajectory &t, const Ogre::ColourValue &color, const Ogre::ColourValue &color2)
Definition: TrajectoryFamilyVisualization.h:283
TrajectoryFamilyVisualizationCommonBase(Visualization3D *visualization)
Definition: TrajectoryFamilyVisualization.h:95
Base class for template TrajectoryFamilyVisualizationBase.
Definition: TrajectoryFamilyVisualization.h:60
static const TrajectoryInfo & derefIfNeeded(const Trajectory &t)
Definition: TrajectoryFamilyVisualization.h:167
TrajectoryFamilyVisualizationBase(Visualization3D *visualization)
Definition: TrajectoryFamilyVisualization.h:185
LineStripObject * mHighlightedTrajectory
Definition: TrajectoryFamilyVisualization.h:152
void redraw()
Definition: TrajectoryFamilyVisualization.h:138
void drawFamily(const std::vector< Trajectory > &f)
Definition: TrajectoryFamilyVisualization.h:209
bool mHighlightBest
Definition: TrajectoryFamilyVisualization.h:149
Visualization3D * mVisualization
Definition: TrajectoryFamilyVisualization.h:154
static const TrajectoryInfo & derefIfNeeded(const Trajectory &t)
Definition: TrajectoryFamilyVisualization.h:174
HighlightProperty mHighlight
Definition: TrajectoryFamilyVisualization.h:151
float mZOffset
Definition: TrajectoryFamilyVisualization.h:147
PropertyHint minimum(const T &min)
Definition: TrajectoryFamilyVisualization.h:182
void point(const Ogre::Vector3 &point)
float mEndPointMarkerSize
Definition: TrajectoryFamilyVisualization.h:148
Setter< T > setterNotify(T &member, boost::function< void()> notifyFn)
bool mHideNotAdmissible
Definition: TrajectoryFamilyVisualization.h:146
Ogre::ManualObject * mManualObject
Definition: TrajectoryFamilyVisualization.h:150
robot::PoseVelocityTrajectory trajectory
Definition: TrajectoryFamily.h:65
double costs
Definition: TrajectoryFamily.h:67
std::enable_if< std::is_floating_point< T >::value, T >::type rad2deg(T value)
only used if NeedDeref (= IsPointerOrSharedPointer<Trajectory>) is false since there is an explicit s...
Definition: TrajectoryFamilyVisualization.h:165
virtual Ogre::ColourValue getColor(const Trajectory &t)=0
overwrite in subclass to determine color
bool mHideAll
Definition: TrajectoryFamilyVisualization.h:144
void reflect(Reflector &r)
Definition: TrajectoryFamilyVisualization.h:108