Camera.hh
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2012 Open Source Robotics Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16 */
17 #ifndef GAZEBO_RENDERING_CAMERA_HH_
18 #define GAZEBO_RENDERING_CAMERA_HH_
19 
20 #include <memory>
21 #include <functional>
22 
23 #include <boost/enable_shared_from_this.hpp>
24 #include <string>
25 #include <utility>
26 #include <list>
27 #include <vector>
28 #include <deque>
29 #include <sdf/sdf.hh>
30 #include <ignition/math/Angle.hh>
31 #include <ignition/math/Pose3.hh>
32 #include <ignition/math/Quaternion.hh>
33 #include <ignition/math/Vector2.hh>
34 #include <ignition/math/Vector3.hh>
35 
36 #include "gazebo/msgs/msgs.hh"
37 
38 #include "gazebo/transport/Node.hh"
40 
41 #include "gazebo/common/Event.hh"
42 #include "gazebo/common/PID.hh"
43 #include "gazebo/common/Time.hh"
44 
46 #include "gazebo/msgs/MessageTypes.hh"
48 #include "gazebo/util/system.hh"
49 
50 // Forward Declarations
51 namespace Ogre
52 {
53  class Texture;
54  class RenderTarget;
55  class Camera;
56  class Viewport;
57  class SceneNode;
58  class AnimationState;
59 }
60 
61 namespace gazebo
62 {
63  namespace math
64  {
65  class Pose;
66  }
67 
70  namespace rendering
71  {
72  class MouseEvent;
73  class ViewController;
74  class Scene;
75  class CameraPrivate;
76 
80 
85  class GZ_RENDERING_VISIBLE Camera :
86  public boost::enable_shared_from_this<Camera>
87  {
92  public: Camera(const std::string &_namePrefix, ScenePtr _scene,
93  bool _autoRender = true);
94 
96  public: virtual ~Camera();
97 
100  public: virtual void Load(sdf::ElementPtr _sdf);
101 
103  public: virtual void Load();
104 
106  public: virtual void Init();
107 
110  public: void SetRenderRate(const double _hz);
111 
114  public: double RenderRate() const;
115 
121  public: virtual void Render(const bool _force = false);
122 
126  public: virtual void PostRender();
127 
133  public: virtual void Update();
134 
138  public: virtual void Fini();
139 
142  public: bool Initialized() const;
143 
147  public: void SetWindowId(unsigned int _windowId);
148 
151  public: unsigned int WindowId() const;
152 
155  public: void SetScene(ScenePtr _scene);
156 
159  public: ignition::math::Vector3d WorldPosition() const;
160 
163  public: ignition::math::Quaterniond WorldRotation() const;
164 
168  public: virtual void SetWorldPose(const math::Pose &_pose)
169  GAZEBO_DEPRECATED(8.0);
170 
173  public: virtual void SetWorldPose(const ignition::math::Pose3d &_pose);
174 
177  public: ignition::math::Pose3d WorldPose() const;
178 
181  public: void SetWorldPosition(const ignition::math::Vector3d &_pos);
182 
185  public: void SetWorldRotation(const ignition::math::Quaterniond &_quat);
186 
189  public: void Translate(const ignition::math::Vector3d &_direction);
190 
195  public: void Roll(const ignition::math::Angle &_angle,
196  ReferenceFrame _relativeTo = RF_LOCAL);
197 
202  public: void Pitch(const ignition::math::Angle &_angle,
203  ReferenceFrame _relativeTo = RF_LOCAL);
204 
209  public: void Yaw(const ignition::math::Angle &_angle,
210  ReferenceFrame _relativeTo = RF_WORLD);
211 
215  public: virtual void SetClipDist(const float _near, const float _far);
216 
219  public: void SetHFOV(const ignition::math::Angle &_angle);
220 
223  public: ignition::math::Angle HFOV() const;
224 
229  public: ignition::math::Angle VFOV() const;
230 
234  public: void SetImageSize(const unsigned int _w, const unsigned int _h);
235 
238  public: void SetImageWidth(const unsigned int _w);
239 
242  public: void SetImageHeight(const unsigned int _h);
243 
246  public: virtual unsigned int ImageWidth() const;
247 
250  public: unsigned int ImageMemorySize() const;
251 
254  public: unsigned int TextureWidth() const;
255 
258  public: virtual unsigned int ImageHeight() const;
259 
262  public: unsigned int ImageDepth() const;
263 
266  public: std::string ImageFormat() const;
267 
270  public: unsigned int TextureHeight() const;
271 
274  public: size_t ImageByteSize() const;
275 
281  public: static size_t ImageByteSize(const unsigned int _width,
282  const unsigned int _height,
283  const std::string &_format);
284 
290  public: double ZValue(const int _x, const int _y);
291 
294  public: double NearClip() const;
295 
298  public: double FarClip() const;
299 
302  public: void EnableSaveFrame(const bool _enable);
303 
306  public: bool CaptureData() const;
307 
310  public: void SetSaveFramePathname(const std::string &_pathname);
311 
315  public: bool SaveFrame(const std::string &_filename);
316 
319  public: Ogre::Camera *OgreCamera() const;
320 
323  public: Ogre::Viewport *OgreViewport() const;
324 
327  public: unsigned int ViewportWidth() const;
328 
331  public: unsigned int ViewportHeight() const;
332 
335  public: ignition::math::Vector3d Up() const;
336 
339  public: ignition::math::Vector3d Right() const;
340 
343  public: virtual float AvgFPS() const;
344 
347  public: virtual unsigned int TriangleCount() const;
348 
351  public: void SetAspectRatio(float _ratio);
352 
355  public: float AspectRatio() const;
356 
359  public: void SetSceneNode(Ogre::SceneNode *_node);
360 
363  public: Ogre::SceneNode *SceneNode() const;
364 
370  public: virtual const unsigned char *ImageData(const unsigned int i = 0)
371  const;
372 
375  public: std::string Name() const;
376 
379  public: std::string ScopedName() const;
380 
383  public: void SetName(const std::string &_name);
384 
386  public: void ToggleShowWireframe();
387 
390  public: void ShowWireframe(const bool _s);
391 
394  public: void SetCaptureData(const bool _value);
395 
397  public: void SetCaptureDataOnce();
398 
412  public: bool StartVideo(const std::string &_format,
413  const std::string &_filename = "");
414 
419  public: bool StopVideo();
420 
426  public: bool SaveVideo(const std::string &_filename);
427 
434  public: bool ResetVideo();
435 
438  public: void CreateRenderTexture(const std::string &_textureName);
439 
442  public: ScenePtr GetScene() const;
443 
450  public: bool WorldPointOnPlane(const int _x, const int _y,
451  const ignition::math::Planed &_plane,
452  ignition::math::Vector3d &_result);
453 
461  public: virtual void CameraToViewportRay(const int _screenx,
462  const int _screeny,
463  ignition::math::Vector3d &_origin,
464  ignition::math::Vector3d &_dir) const;
465 
468  public: virtual void SetRenderTarget(Ogre::RenderTarget *_target);
469 
478  public: void AttachToVisual(const std::string &_visualName,
479  const bool _inheritOrientation,
480  const double _minDist = 0.0, const double _maxDist = 0.0);
481 
490  public: void AttachToVisual(uint32_t _id,
491  const bool _inheritOrientation,
492  const double _minDist = 0.0, const double _maxDist = 0.0);
493 
496  public: void TrackVisual(const std::string &_visualName);
497 
500  public: Ogre::Texture *RenderTexture() const;
501 
504  public: ignition::math::Vector3d Direction() const;
505 
510  public: event::ConnectionPtr ConnectNewImageFrame(
511  std::function<void (const unsigned char *, unsigned int, unsigned int,
512  unsigned int, const std::string &)> _subscriber);
513 
517  public: void DisconnectNewImageFrame(event::ConnectionPtr &_c)
518  GAZEBO_DEPRECATED(8.0);
519 
528  public: static bool SaveFrame(const unsigned char *_image,
529  const unsigned int _width, const unsigned int _height,
530  const int _depth, const std::string &_format,
531  const std::string &_filename);
532 
535  public: common::Time LastRenderWallTime() const;
536 
541  public: bool IsVisible(VisualPtr _visual);
542 
547  public: bool IsVisible(const std::string &_visualName);
548 
550  public: bool IsAnimating() const;
551 
556  public: virtual bool MoveToPosition(const ignition::math::Pose3d &_pose,
557  const double _time);
558 
566  public: bool MoveToPositions(
567  const std::vector<ignition::math::Pose3d> &_pts,
568  const double _time,
569  std::function<void()> _onComplete = NULL);
570 
573  public: std::string ScreenshotPath() const;
574 
577  public: DistortionPtr LensDistortion() const;
578 
584  public: virtual bool SetProjectionType(const std::string &_type);
585 
589  public: std::string ProjectionType() const;
590 
594  public: virtual bool SetBackgroundColor(const common::Color &_color);
595 
598  public: ignition::math::Matrix4d ProjectionMatrix() const;
599 
603  public: virtual ignition::math::Vector2i Project(
604  const ignition::math::Vector3d &_pt) const;
605 
608  public: VisualPtr TrackedVisual() const;
609 
613  public: bool TrackIsStatic() const;
614 
619  public: void SetTrackIsStatic(const bool _isStatic);
620 
625  public: bool TrackUseModelFrame() const;
626 
632  public: void SetTrackUseModelFrame(const bool _useModelFrame);
633 
637  public: ignition::math::Vector3d TrackPosition() const;
638 
642  public: void SetTrackPosition(const ignition::math::Vector3d &_pos);
643 
647  public: double TrackMinDistance() const;
648 
652  public: double TrackMaxDistance() const;
653 
658  public: void SetTrackMinDistance(const double _dist);
659 
664  public: void SetTrackMaxDistance(const double _dist);
665 
671  public: bool TrackInheritYaw() const;
672 
678  public: void SetTrackInheritYaw(const bool _inheritYaw);
679 
681  protected: virtual void RenderImpl();
682 
684  protected: void ReadPixelBuffer();
685 
689  protected: bool TrackVisualImpl(const std::string &_visualName);
690 
694  protected: virtual bool TrackVisualImpl(VisualPtr _visual);
695 
705  protected: virtual bool AttachToVisualImpl(const std::string &_name,
706  const bool _inheritOrientation,
707  const double _minDist = 0, const double _maxDist = 0);
708 
718  protected: virtual bool AttachToVisualImpl(uint32_t _id,
719  const bool _inheritOrientation,
720  const double _minDist = 0, const double _maxDist = 0);
721 
731  protected: virtual bool AttachToVisualImpl(VisualPtr _visual,
732  const bool _inheritOrientation,
733  const double _minDist = 0, const double _maxDist = 0);
734 
737  protected: std::string FrameFilename();
738 
741  protected: virtual void AnimationComplete();
742 
744  protected: virtual void UpdateFOV();
745 
747  protected: virtual void SetClipDist();
748 
755  protected: virtual void SetFixedYawAxis(const bool _useFixed,
756  const ignition::math::Vector3d &_fixedAxis =
757  ignition::math::Vector3d::UnitY);
758 
766  private: void ConvertRGBToBAYER(unsigned char *_dst,
767  const unsigned char *_src, const std::string &_format,
768  const int _width, const int _height);
769 
773  private: static int OgrePixelFormat(const std::string &_format);
774 
777  private: void OnCmdMsg(ConstCameraCmdPtr &_msg);
778 
780  private: void CreateCamera();
781 
783  protected: std::string name;
784 
786  protected: std::string scopedName;
787 
789  protected: std::string scopedUniqueName;
790 
792  protected: sdf::ElementPtr sdf;
793 
795  protected: unsigned int windowId;
796 
798  protected: unsigned int textureWidth;
799 
801  protected: unsigned int textureHeight;
802 
804  protected: Ogre::Camera *camera;
805 
807  protected: Ogre::Viewport *viewport;
808 
810  protected: Ogre::SceneNode *sceneNode;
811 
813  protected: unsigned char *saveFrameBuffer;
814 
816  protected: unsigned char *bayerFrameBuffer;
817 
819  protected: unsigned int saveCount;
820 
822  protected: std::string screenshotPath;
823 
825  protected: int imageFormat;
826 
828  protected: int imageWidth;
829 
831  protected: int imageHeight;
832 
834  protected: Ogre::RenderTarget *renderTarget;
835 
837  protected: Ogre::Texture *renderTexture;
838 
840  protected: bool captureData;
841 
843  protected: bool captureDataOnce;
844 
846  protected: bool newData;
847 
850 
852  protected: ScenePtr scene;
853 
855  protected: event::EventT<void(const unsigned char *,
856  unsigned int, unsigned int, unsigned int,
857  const std::string &)> newImageFrame;
858 
860  protected: std::vector<event::ConnectionPtr> connections;
861 
863  protected: std::list<msgs::Request> requests;
864 
866  protected: bool initialized;
867 
869  protected: Ogre::AnimationState *animState;
870 
873 
875  protected: std::function<void()> onAnimationComplete;
876 
879  private: std::unique_ptr<CameraPrivate> dataPtr;
880  };
882  }
883 }
884 #endif
Basic camera sensor.
Definition: Camera.hh:85
common::Time lastRenderWallTime
Time the last frame was rendered.
Definition: Camera.hh:849
ReferenceFrame
Frame of reference.
Definition: RenderTypes.hh:244
bool initialized
True if initialized.
Definition: Camera.hh:866
Ogre::Texture * renderTexture
Texture that receives results from rendering.
Definition: Camera.hh:837
Forward declarations for the common classes.
Definition: Animation.hh:33
boost::shared_ptr< Distortion > DistortionPtr
Definition: RenderTypes.hh:198
Encapsulates a position and rotation in three space.
Definition: Pose.hh:42
std::string scopedUniqueName
Scene scoped name of the camera with a unique ID.
Definition: Camera.hh:789
unsigned char * saveFrameBuffer
Buffer for a single image frame.
Definition: Camera.hh:813
unsigned char * bayerFrameBuffer
Buffer for a bayer image frame.
Definition: Camera.hh:816
std::string screenshotPath
Path to saved screenshots.
Definition: Camera.hh:822
bool captureDataOnce
True to capture a frame once and save to disk.
Definition: Camera.hh:843
bool captureData
True to capture frames into an image buffer.
Definition: Camera.hh:840
sdf::ElementPtr sdf
Camera&#39;s SDF values.
Definition: Camera.hh:792
Ogre::RenderTarget * renderTarget
Target that renders frames.
Definition: Camera.hh:834
Ogre::SceneNode * sceneNode
Scene node that controls camera position and orientation.
Definition: Camera.hh:810
Local frame.
Definition: RenderTypes.hh:247
std::vector< event::ConnectionPtr > connections
The camera&#39;s event connections.
Definition: Camera.hh:860
Ogre::Viewport * viewport
Viewport the ogre camera uses.
Definition: Camera.hh:807
boost::shared_ptr< Scene > ScenePtr
Definition: RenderTypes.hh:82
int imageWidth
Save image width.
Definition: Camera.hh:828
bool newData
True if new data is available.
Definition: Camera.hh:846
unsigned int windowId
ID of the window that the camera is attached to.
Definition: Camera.hh:795
common::Time prevAnimTime
Previous time the camera animation was updated.
Definition: Camera.hh:872
std::string scopedName
Scene scoped name of the camera.
Definition: Camera.hh:786
ScenePtr scene
Pointer to the scene.
Definition: Camera.hh:852
unsigned int saveCount
Number of saved frames.
Definition: Camera.hh:819
std::list< msgs::Request > requests
List of requests.
Definition: Camera.hh:863
unsigned int textureHeight
Height of the render texture.
Definition: Camera.hh:801
int imageHeight
Save image height.
Definition: Camera.hh:831
World frame.
Definition: RenderTypes.hh:253
boost::shared_ptr< Connection > ConnectionPtr
Definition: CommonTypes.hh:134
std::function< void()> onAnimationComplete
User callback for when an animation completes.
Definition: Camera.hh:875
#define NULL
Definition: CommonTypes.hh:31
Definition: JointMaker.hh:39
Defines a color.
Definition: Color.hh:36
int imageFormat
Format for saving images.
Definition: Camera.hh:825
#define GAZEBO_DEPRECATED(version)
Definition: system.hh:302
unsigned int textureWidth
Width of the render texture.
Definition: Camera.hh:798
std::shared_ptr< Visual > VisualPtr
Definition: RenderTypes.hh:114
std::string name
Name of the camera.
Definition: Camera.hh:783
GAZEBO_VISIBLE void Init(google::protobuf::Message &_message, const std::string &_id="")
Initialize a message.
event::EventT< void(const unsigned char *, unsigned int, unsigned int, unsigned int, const std::string &)> newImageFrame
Event triggered when a new frame is generated.
Definition: Camera.hh:857
A class for event processing.
Definition: Event.hh:113
Ogre::AnimationState * animState
Animation state, used to animate the camera.
Definition: Camera.hh:869
A Time class, can be used to hold wall- or sim-time.
Definition: Time.hh:44
Ogre::Camera * camera
The OGRE camera.
Definition: Camera.hh:804