30 #ifndef _MIRA_PILOT_TRAJECTORYFAMILYVISUALIZATION_H_ 31 #define _MIRA_PILOT_TRAJECTORYFAMILYVISUALIZATION_H_ 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> 55 namespace mira {
namespace pilot {
67 mDashed(
false), mColor2(0.0f, 0.0f, 0.0f, 1.0f) {}
69 template <
typename Reflector>
74 r.property(
"Dashed", mDashed,
76 "Show each trajectory sample interval by dashing",
79 r.property(
"Color2", mColor2,
81 "The second color for drawing the selected trajectory in dashed mode",
82 Ogre::ColourValue(0.0f, 0.0f, 0.0f, 1.0f));
86 bool isDashed()
const {
return mDashed; }
87 const Ogre::ColourValue& color2()
const {
return mColor2; }
91 Ogre::ColourValue mColor2;
107 template <
typename Reflector>
112 "Hide all trajectories (except highlight)",
false);
115 "Hide unreachable trajectories",
true);
118 "Hide not admissible trajectories",
true);
121 "Raise trajectories above map", 0.f);
124 "Size of marker for trajectory end point (improve visibility of trajectory swarm)", 0.01f,
128 "Highlight the best trajectory (manual highlight selection takes preference, if active)",
true);
130 "Select a single trajectory to highlight", HighlightProperty(
this));
134 void setupScene(Ogre::SceneManager* mgr, Ogre::SceneNode* node, std::string name);
163 template<
typename Trajectory,
171 template<
typename Trajectory>
181 template <
typename Trajectory = TrajectoryInfo>
193 void drawFamily(
const std::vector<Trajectory>& f);
196 virtual Ogre::ColourValue
getColor(
const Trajectory& t) = 0;
199 const Ogre::ColourValue& color,
200 const Ogre::ColourValue& color2);
208 template <
typename Trajectory>
211 double minCost = std::numeric_limits<double>::max();
212 const Trajectory* bestTrajectory =
nullptr;
214 if (!mHighlight.isEnabled() && mHighlightBest) {
215 foreach (
const Trajectory& t, f)
219 if ((permit == Objective::Permit::ADMISSIBLE) && (cost < minCost)) {
226 mManualObject->clear();
228 mManualObject->begin(
"NoLight", Ogre::RenderOperation::OT_LINE_LIST);
230 foreach (
const Trajectory& t, f)
232 Ogre::ColourValue c = getColor(t);
239 if (mEndPointMarkerSize <= 0.f)
246 const auto& p = traj.back().p.t;
247 for (
float angle = 0; angle <
deg2rad(360.0); angle +=
deg2rad(10.0))
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);
258 mManualObject->end();
261 mHighlight.setWrapIndex(f.size());
263 if (mHighlight.isEnabled() && f.size())
265 markTrajectory(mHighlightedTrajectory, f[mHighlight.index()], mHighlight.color(),
266 mHighlight.isDashed() ? mHighlight.color2() : mHighlight.color());
267 displayData(f[mHighlight.index()]);
269 else if (mHighlightBest && (bestTrajectory !=
nullptr))
271 markTrajectory(mHighlightedTrajectory, *bestTrajectory, mHighlight.color(),
272 mHighlight.isDashed() ? mHighlight.color2() : mHighlight.color());
273 displayData(*bestTrajectory);
277 mHighlightedTrajectory->setVisible(
false);
278 mText->setVisible(
false);
282 template <
typename Trajectory>
284 const Ogre::ColourValue& color,
285 const Ogre::ColourValue& color2)
293 Ogre::Vector3 p1(0.0f, 0.0f, 0.0f);
296 Ogre::Vector3 p2(s.
p.t.x(), s.
p.t.y(), mZOffset);
297 line->
point(p1, color);
298 line->
point(p2, color2);
303 line->
setVisible(mVisualization->isEnabled());
306 template <
typename Trajectory>
309 mText->setCharacterHeight(mHighlight.textsize());
310 mText->setColor(mHighlight.color());
311 mText->setVisible(mVisualization->isEnabled());
313 std::stringstream ss;
315 ss <<
"velocity= " << v.x() <<
", " <<
rad2deg(v.phi()) <<
"deg" << std::endl;
319 case Objective::Permit::ADMISSIBLE : ss <<
"\npermit=Admissible";
321 case Objective::Permit::NOT_ADMISSIBLE : ss <<
"\npermit=NotAdmissible";
323 case Objective::Permit::NOT_REACHABLE : ss <<
"\npermit=NotReachable";
325 default : ss <<
"\npermit=Unknown";
329 mText->setCaption(ss.str());
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
virtual ~TrajectoryFamilyVisualizationCommonBase()
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