Visual Servoing Platform  version 3.2.0 under development (2019-01-22)
HelloWorldOgreAdvanced.cpp
1 /****************************************************************************
2  *
3  * ViSP, open source Visual Servoing Platform software.
4  * Copyright (C) 2005 - 2019 by Inria. All rights reserved.
5  *
6  * This software is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  * See the file LICENSE.txt at the root directory of this source
11  * distribution for additional information about the GNU GPL.
12  *
13  * For using ViSP with software that can not be combined with the GNU
14  * GPL, please contact Inria about acquiring a ViSP Professional
15  * Edition License.
16  *
17  * See http://visp.inria.fr for more information.
18  *
19  * This software was developed at:
20  * Inria Rennes - Bretagne Atlantique
21  * Campus Universitaire de Beaulieu
22  * 35042 Rennes Cedex
23  * France
24  *
25  * If you have questions regarding the use of this file, please contact
26  * Inria at visp@inria.fr
27  *
28  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
29  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
30  *
31  * Description:
32  * Ogre example.
33  *
34  * Authors:
35  * Bertrand Delabarre
36  *
37  *****************************************************************************/
45 #include <iostream>
46 
47 #include <visp3/ar/vpAROgre.h>
48 #include <visp3/core/vpCameraParameters.h>
49 #include <visp3/core/vpHomogeneousMatrix.h>
50 #include <visp3/core/vpImage.h>
51 #include <visp3/sensor/vp1394TwoGrabber.h>
52 #include <visp3/sensor/vpOpenCVGrabber.h>
53 #include <visp3/sensor/vpV4l2Grabber.h>
54 
55 #if defined(VISP_HAVE_OGRE)
56 
57 #ifndef DOXYGEN_SHOULD_SKIP_THIS
58 
59 class vpAROgreAdvanced : public vpAROgre
60 {
61 private:
62  // Animation attribute
63  Ogre::AnimationState *mAnimationState;
64 
65 public:
66  vpAROgreAdvanced(const vpCameraParameters &cam = vpCameraParameters(), unsigned int width = 640,
67  unsigned int height = 480)
68  : vpAROgre(cam, width, height)
69  {
70  mAnimationState = NULL;
71  }
72 
73 protected:
74  void createScene()
75  {
76  // Create the Entity
77  Ogre::Entity *robot = mSceneMgr->createEntity("Robot", "robot.mesh");
78  // Attach robot to scene graph
79  Ogre::SceneNode *RobotNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("Robot");
80  // RobotNode->setPosition((Ogre::Real)-0.3, (Ogre::Real)0.2,
81  // (Ogre::Real)0);
82  RobotNode->attachObject(robot);
83  RobotNode->scale((Ogre::Real)0.001, (Ogre::Real)0.001, (Ogre::Real)0.001);
84  RobotNode->pitch(Ogre::Degree(180));
85  RobotNode->yaw(Ogre::Degree(-90));
86 
87  // The animation
88  // Set the good animation
89  mAnimationState = robot->getAnimationState("Idle");
90  // Start over when finished
91  mAnimationState->setLoop(true);
92  // Animation enabled
93  mAnimationState->setEnabled(true);
94  }
95 
96  bool customframeEnded(const Ogre::FrameEvent &evt)
97  {
98  // Update animation
99  // To move, we add it the time since last frame
100  mAnimationState->addTime(evt.timeSinceLastFrame);
101  return true;
102  }
103 }; // End of vpAROgreAdvanced class definition
104 #endif
105 
106 #endif
107 
108 int main()
109 {
110  try {
111 #if defined(VISP_HAVE_OGRE)
112 #if defined(VISP_HAVE_V4L2) || defined(VISP_HAVE_DC1394) || (VISP_HAVE_OPENCV_VERSION >= 0x020100)
113 
114  // Image to store gathered data
115  // Here we acquire a grey level image. The consequence will be that
116  // the background texture used in Ogre renderer will be also in grey
117  // level.
119 
120 // Now we try to find an available framegrabber
121 #if defined(VISP_HAVE_V4L2)
122  // Video for linux 2 grabber
123  vpV4l2Grabber grabber;
124  // Open frame grabber
125  // Here we acquire an image from an available framegrabber to update
126  // the image size
127  grabber.open(I);
128  grabber.acquire(I);
129 #elif defined(VISP_HAVE_DC1394)
130  // libdc1394-2
131  vp1394TwoGrabber grabber;
132  // Open frame grabber
133  // Here we acquire an image from an available framegrabber to update
134  // the image size
135  grabber.open(I);
136  grabber.acquire(I);
137 #elif defined(VISP_HAVE_OPENCV)
138  // OpenCV to gather images
139  cv::VideoCapture grabber(0); // open the default camera
140  if (!grabber.isOpened()) { // check if we succeeded
141  std::cout << "Failed to open the camera" << std::endl;
142  return -1;
143  }
144  cv::Mat frame;
145  grabber >> frame; // get a new frame from camera
146  vpImageConvert::convert(frame, I);
147 #endif
148 
149  // Parameters of our camera
150  double px = 565;
151  double py = 565;
152  double u0 = I.getWidth() / 2;
153  double v0 = I.getHeight() / 2;
154  vpCameraParameters cam(px, py, u0, v0);
155  // The matrix with our pose
157  cMo[2][3] = 0.5; // Z = 0.5 meter
158 
159  // Our object
160  vpAROgreAdvanced ogre(cam, I.getWidth(), I.getHeight());
161  // Initialisation
162  ogre.init(I);
163 
164  // Rendering loop
165  while (ogre.continueRendering()) {
166 // Acquire a new image
167 #if defined(VISP_HAVE_V4L2) || defined(VISP_HAVE_DC1394)
168  grabber.acquire(I);
169 #elif defined(VISP_HAVE_OPENCV)
170  grabber >> frame;
171  vpImageConvert::convert(frame, I);
172 #endif
173  // Pose computation
174  // ...
175  // cMo updated
176  // Display with vpAROgre
177  ogre.display(I, cMo);
178  }
179 #else
180  std::cout << "You need an available framegrabber to run this example" << std::endl;
181 #endif
182 #else
183  std::cout << "You need Ogre3D to run this example" << std::endl;
184 #endif
185  return EXIT_SUCCESS;
186  } catch (const vpException &e) {
187  std::cout << "Catch an exception: " << e << std::endl;
188  return EXIT_FAILURE;
189  } catch (...) {
190  std::cout << "Catch an exception " << std::endl;
191  return EXIT_FAILURE;
192  }
193 }
void acquire(vpImage< unsigned char > &I)
void open(vpImage< unsigned char > &I)
unsigned int getWidth() const
Definition: vpImage.h:239
static void convert(const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest)
Implementation of an homogeneous matrix and operations on such kind of matrices.
virtual bool customframeEnded(const Ogre::FrameEvent &evt)
Definition: vpAROgre.cpp:560
error that can be emited by ViSP classes.
Definition: vpException.h:71
Implementation of an augmented reality viewer using Ogre3D 3rd party.
Definition: vpAROgre.h:90
void acquire(vpImage< unsigned char > &I)
void open(vpImage< unsigned char > &I)
vp_deprecated void init()
Generic class defining intrinsic camera parameters.
Class that is a wrapper over the Video4Linux2 (V4L2) driver.
virtual void createScene(void)
Definition: vpAROgre.h:299
unsigned int getHeight() const
Definition: vpImage.h:178
Class for firewire ieee1394 video devices using libdc1394-2.x api.