OptrisImager.cpp
Go to the documentation of this file.
1 #include "OptrisImager.h"
2 
3 namespace optris_drivers
4 {
5 
6 OptrisImager::OptrisImager(evo::IRDevice* dev, evo::IRDeviceParams params)
7 {
8  _imager.init(&params, dev->getFrequency(), dev->getWidth(), dev->getHeight(), dev->controlledViaHID());
9  _imager.setClient(this);
10 
11  _bufferRaw = new unsigned char[dev->getRawBufferSize()];
12 
15 
16  _thermal_pub = it.advertise("thermal_image", 1);
17  _thermal_image.header.frame_id = "thermal_image";
18  _thermal_image.height = _imager.getHeight();
19  _thermal_image.width = _imager.getWidth();
20  _thermal_image.encoding = "mono16";
21  _thermal_image.step = _thermal_image.width * 2;
22  _thermal_image.data.resize(_thermal_image.height * _thermal_image.step);
23 
24 
25  if(_imager.hasBispectralTechnology())
26  {
27  _visible_pub = it.advertise("visible_image", 1);
28  _visible_image.header.frame_id = "visible_image";
29  _visible_image.height = _imager.getVisibleHeight();
30  _visible_image.width = _imager.getVisibleWidth();
31  _visible_image.encoding = "yuv422";
32  _visible_image.step = _visible_image.width * 2;
33  _visible_image.data.resize(_visible_image.height * _visible_image.step);
34  }
35 
36  // advertise the camera internal timer
37  _timer_pub= n.advertise<sensor_msgs::TimeReference>("optris_timer", 1 );
38  _device_timer.header.frame_id=_thermal_image.header.frame_id;
39 
40  _sAuto = n.advertiseService("auto_flag", &OptrisImager::onAutoFlag, this);
41  _sForce = n.advertiseService("force_flag", &OptrisImager::onForceFlag, this);
42  _sTemp = n.advertiseService("temperature_range", &OptrisImager::onSetTemperatureRange, this);
43 
44  // advertise all of the camera's temperatures in a single custom message
45  _temp_pub = n.advertise<Temperature> ("internal_temperature", 1);
46  _internal_temperature.header.frame_id=_thermal_image.header.frame_id;
47 
48  _flag_pub = n.advertise<Flag>("flag_state", 1);
49 
50  _img_cnt = 0;
51 
52  _dev = dev;
53 }
54 
56 {
57  delete [] _bufferRaw;
58 }
59 
61 {
62  _dev->startStreaming();
63 
65  ros::Timer timer = n.createTimer(ros::Duration(1.0/_imager.getMaxFramerate()), &OptrisImager::onTimer, this);
66  ros::spin();
67 
68  _dev->stopStreaming();
69 }
70 
72 {
73  int retval = _dev->getFrame(_bufferRaw);
74  if(retval==evo::IRIMAGER_SUCCESS)
75  {
76  _imager.process(_bufferRaw);
77  }
78  if(retval==evo::IRIMAGER_DISCONNECTED)
79  {
80  ros::shutdown();
81  }
82 }
83 
84 void OptrisImager::onThermalFrame(unsigned short* image, unsigned int w, unsigned int h, evo::IRFrameMetadata meta, void* arg)
85 {
86  memcpy(&_thermal_image.data[0], image, w * h * sizeof(*image));
87 
88  _thermal_image.header.seq = ++_img_cnt;
89  _thermal_image.header.stamp = ros::Time::now();
91 
92  _device_timer.header.seq = _thermal_image.header.seq;
93  _device_timer.header.stamp = _thermal_image.header.stamp;
94  _device_timer.time_ref.fromNSec(meta.timestamp);
95 
96  _internal_temperature.header.seq = _thermal_image.header.seq;
97  _internal_temperature.header.stamp = _thermal_image.header.stamp;
98 
99  _internal_temperature.temperature_flag = _imager.getTempFlag();
100  _internal_temperature.temperature_box = _imager.getTempBox();
101  _internal_temperature.temperature_chip = _imager.getTempChip();
102 
103  _internal_temperature.header.frame_id = _thermal_image.header.frame_id;
104 
107 }
108 
109 void OptrisImager::onVisibleFrame(unsigned char* image, unsigned int w, unsigned int h, evo::IRFrameMetadata meta, void* arg)
110 {
111  if(_visible_pub.getNumSubscribers()==0) return;
112 
113  memcpy(&_visible_image.data[0], image, 2 * w * h * sizeof(*image));
114 
115  _visible_image.header.seq = _img_cnt;
116  _visible_image.header.stamp = ros::Time::now();
118 }
119 
120 void OptrisImager::onFlagStateChange(evo::EnumFlagState flagstate, void* arg)
121 {
122  optris_drivers::Flag flag;
123  flag.flag_state = flagstate;
124  flag.header.frame_id = _thermal_image.header.frame_id;
125  flag.header.stamp = _thermal_image.header.stamp;
126  _flag_pub.publish(flag);
127 }
128 
130 {
131 
132 }
133 
134 bool OptrisImager::onAutoFlag(AutoFlag::Request &req, AutoFlag::Response &res)
135 {
136  _imager.setAutoFlag(req.autoFlag);
137  res.isAutoFlagActive = _imager.getAutoFlag();
138  return true;
139 }
140 
141 bool OptrisImager::onForceFlag(std_srvs::Empty::Request& req, std_srvs::Empty::Response& res)
142 {
143  _imager.forceFlagEvent();
144  return true;
145 }
146 
147 bool OptrisImager::onSetTemperatureRange(TemperatureRange::Request &req, TemperatureRange::Response &res)
148 {
149  bool validParam = _imager.setTempRange(req.temperatureRangeMin, req.temperatureRangeMax);
150 
151  if(validParam)
152  {
153  _imager.forceFlagEvent(1000.f);
154  }
155 
156  res.success = validParam;
157 
158  return true;
159 }
160 
161 }
image_transport::Publisher _visible_pub
Definition: OptrisImager.h:128
sensor_msgs::Image _thermal_image
Definition: OptrisImager.h:118
bool onForceFlag(std_srvs::Empty::Request &req, std_srvs::Empty::Response &res)
ros::ServiceServer _sTemp
Definition: OptrisImager.h:140
void publish(const boost::shared_ptr< M > &message) const
f
bool onSetTemperatureRange(TemperatureRange::Request &req, TemperatureRange::Response &res)
virtual void onProcessExit(void *arg)
Publisher advertise(const std::string &base_topic, uint32_t queue_size, bool latch=false)
ServiceServer advertiseService(const std::string &service, bool(T::*srv_func)(MReq &, MRes &), T *obj)
virtual void onVisibleFrame(unsigned char *image, unsigned int w, unsigned int h, evo::IRFrameMetadata meta, void *arg)
sensor_msgs::TimeReference _device_timer
Definition: OptrisImager.h:122
uint32_t getNumSubscribers() const
ros::ServiceServer _sAuto
Definition: OptrisImager.h:136
ROSCPP_DECL void spin(Spinner &spinner)
void onTimer(const ros::TimerEvent &event)
bool onAutoFlag(AutoFlag::Request &req, AutoFlag::Response &res)
void publish(const sensor_msgs::Image &message) const
OptrisImager(evo::IRDevice *dev, evo::IRDeviceParams params)
Definition: OptrisImager.cpp:6
virtual void onThermalFrame(unsigned short *image, unsigned int w, unsigned int h, evo::IRFrameMetadata meta, void *arg)
Timer createTimer(Rate r, Handler h, Obj o, bool oneshot=false, bool autostart=true) const
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
ros::ServiceServer _sForce
Definition: OptrisImager.h:138
sensor_msgs::Image _visible_image
Definition: OptrisImager.h:120
image_transport::Publisher _thermal_pub
Definition: OptrisImager.h:126
optris_drivers::Temperature _internal_temperature
Definition: OptrisImager.h:124
virtual void onFlagStateChange(evo::EnumFlagState flagstate, void *arg)
static Time now()
ROSCPP_DECL void shutdown()


optris_drivers
Author(s): Stefan May (Nuremberg Institute of Technology Georg Simon Ohm - www.th-nuernberg.de), 64-Bit platform supported by Fraunhofer IPA (www.ipa.fraunhofer.de), Support for ROS hydro migration by Christopher-Eyk Hrabia (DAI-Labor, Technische Universität Berlin)
autogenerated on Mon Jun 10 2019 14:09:59