Files
rviz_camera_stream_ar/include/rviz_camera_stream/camera_display.h
2022-08-30 18:52:34 +03:00

174 lines
4.7 KiB
C++

/*
* Copyright (c) 2009, Willow Garage, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the Willow Garage, Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef RVIZ_CAMERA_STREAM_CAMERA_DISPLAY_H
#define RVIZ_CAMERA_STREAM_CAMERA_DISPLAY_H
#include <QObject>
#include <string>
#ifndef Q_MOC_RUN
#include <OgreMaterial.h>
#include <OgreRenderTargetListener.h>
#include <OgreSharedPtr.h>
#include <OgreTexture.h>
# include <sensor_msgs/CameraInfo.h>
# include "rviz/image/image_display_base.h"
#include <std_srvs/Trigger.h>
#endif
namespace Ogre
{
class SceneNode;
class ManualObject;
class Rectangle2D;
class Camera;
}
namespace video_export
{
class VideoPublisher;
}
namespace rviz
{
class EnumProperty;
class FloatProperty;
class IntProperty;
class RenderPanel;
class RosTopicProperty;
class DisplayGroupVisibilityProperty;
class ColorProperty;
/**
* \class CameraPub
*
*/
class CameraPub: public Display, public Ogre::RenderTargetListener
{
Q_OBJECT
public:
CameraPub();
virtual ~CameraPub();
// Overrides from Display
virtual void onInitialize();
virtual void fixedFrameChanged();
virtual void update(float wall_dt, float ros_dt);
virtual void reset();
// Overrides from Ogre::RenderTargetListener
virtual void preRenderTargetUpdate(const Ogre::RenderTargetEvent& evt);
virtual void postRenderTargetUpdate(const Ogre::RenderTargetEvent& evt);
static const QString BACKGROUND;
static const QString OVERLAY;
static const QString BOTH;
protected:
// overrides from Display
virtual void onEnable();
virtual void onDisable();
private Q_SLOTS:
void forceRender();
void updateTopic();
virtual void updateQueueSize();
virtual void updateFrameRate();
virtual void updateBackgroundColor();
virtual void updateDisplayNamespace();
virtual void updateImageEncoding();
virtual void updateNearClipDistance();
private:
std::string camera_trigger_name_;
ros::NodeHandle nh_;
void subscribe();
void unsubscribe();
ros::ServiceServer trigger_service_;
bool triggerCallback(std_srvs::TriggerRequest& req, std_srvs::TriggerResponse& res);
bool trigger_activated_ = false;
ros::Time last_image_publication_time_ = ros::Time(0);
void caminfoCallback(const sensor_msgs::CameraInfo::ConstPtr& msg);
bool updateCamera();
void clear();
void updateStatus();
ros::Subscriber caminfo_sub_;
RosTopicProperty* topic_property_;
RosTopicProperty* camera_info_property_;
DisplayGroupVisibilityProperty* visibility_property_;
IntProperty* queue_size_property_;
StringProperty* namespace_property_;
FloatProperty* frame_rate_property_;
ColorProperty* background_color_property_;
EnumProperty* image_encoding_property_;
FloatProperty* near_clip_property_;
sensor_msgs::CameraInfo::ConstPtr current_caminfo_;
boost::mutex caminfo_mutex_;
bool new_caminfo_ = false;
bool caminfo_ok_ = false;
bool force_render_ = false;
static inline int count_ = 0;
// the system timestamp
double timestamp;
uint32_t vis_bit_;
video_export::VideoPublisher* video_publisher_ = nullptr;
// render to texture
// from http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Intermediate+Tutorial+7
Ogre::Camera* camera_;
Ogre::TexturePtr rtt_texture_;
Ogre::RenderTexture* render_texture_;
};
} // namespace rviz
#endif // RVIZ_CAMERA_STREAM_CAMERA_DISPLAY_H