thermal.cpp
Go to the documentation of this file.
1 /******************************************************************************
2  STDR Simulator - Simple Two DImensional Robot Simulator
3  Copyright (C) 2013 STDR Simulator
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; either version 3 of the License, or
7  (at your option) any later version.
8  This program is distributed in the hope that it will be useful,
9  but WITHOUT ANY WARRANTY; without even the implied warranty of
10  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  GNU General Public License for more details.
12  You should have received a copy of the GNU General Public License
13  along with this program; if not, write to the Free Software Foundation,
14  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15 
16  Authors :
17  * Manos Tsardoulias, etsardou@gmail.com
18  * Aris Thallas, aris.thallas@gmail.com
19  * Chris Zalidis, zalidis@gmail.com
20 ******************************************************************************/
21 
23 
24 namespace stdr_robot {
25 
30  const nav_msgs::OccupancyGrid& map,
31  const stdr_msgs::ThermalSensorMsg& msg,
32  const std::string& name,
33  ros::NodeHandle& n)
34  : Sensor(map, name, n, msg.pose, msg.frame_id, msg.frequency)
35  {
36  _description = msg;
37 
38  _publisher = n.advertise<stdr_msgs::ThermalSensorMeasurementMsg>
39  ( _namespace + "/" + msg.frame_id, 1 );
40 
42  "stdr_server/thermal_sources_list",
43  1,
45  this);
46  }
47 
53  {
54 
55  }
56 
62  {
63  if (thermal_sources_.thermal_sources.size() == 0) return;
64 
65  stdr_msgs::ThermalSensorMeasurementMsg measuredSourcesMsg;
66 
67  measuredSourcesMsg.header.frame_id = _description.frame_id;
68 
69 
70  float max_range = _description.maxRange;
71  float sensor_th = tf::getYaw(_sensorTransform.getRotation());
72  float min_angle = sensor_th - _description.angleSpan / 2.0;
73  float max_angle = sensor_th + _description.angleSpan / 2.0;
74 
75  measuredSourcesMsg.thermal_source_degrees.push_back(0);
77  for(unsigned int i = 0 ; i < thermal_sources_.thermal_sources.size() ; i++)
78  {
80  float sensor_x = _sensorTransform.getOrigin().x();
81  float sensor_y = _sensorTransform.getOrigin().y();
82  float dist = sqrt(
83  pow(sensor_x - thermal_sources_.thermal_sources[i].pose.x, 2) +
84  pow(sensor_y - thermal_sources_.thermal_sources[i].pose.y, 2)
85  );
86  if(dist > max_range)
87  {
88  continue;
89  }
90 
92  float ang = atan2(
93  thermal_sources_.thermal_sources[i].pose.y - sensor_y,
94  thermal_sources_.thermal_sources[i].pose.x - sensor_x);
95 
96  if(!stdr_robot::angCheck(ang, min_angle, max_angle))
97  {
98  continue;
99  }
100 
101  // Returns the larger temperature found in its range
102  if( thermal_sources_.thermal_sources[i].degrees >
103  measuredSourcesMsg.thermal_source_degrees[0])
104  {
105  measuredSourcesMsg.thermal_source_degrees[0] =
106  thermal_sources_.thermal_sources[i].degrees;
107  }
108  }
109 
110  measuredSourcesMsg.header.stamp = ros::Time::now();
111  measuredSourcesMsg.header.frame_id = _namespace + "_" + _description.frame_id;
112  _publisher.publish( measuredSourcesMsg );
113  }
114 
119  const stdr_msgs::ThermalSourceVector& msg)
120  {
121  thermal_sources_ = msg;
122  }
123 
124 } // namespace stdr_robot
stdr_msgs::ThermalSensorMsg _description
< thermal sensor description
Definition: thermal.h:82
const std::string & _namespace
< The base for the sensor frame_id
Definition: sensor_base.h:114
void publish(const boost::shared_ptr< M > &message) const
ros::Subscriber thermal_sources_subscriber_
The currently existent sources.
Definition: thermal.h:85
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
The main namespace for STDR Robot.
Definition: exceptions.h:27
static double getYaw(const Quaternion &bt_q)
A class that provides sensor abstraction.
Definition: sensor_base.h:40
stdr_msgs::ThermalSourceVector thermal_sources_
Definition: thermal.h:88
TFSIMD_FORCE_INLINE const tfScalar & x() const
ThermalSensor(const nav_msgs::OccupancyGrid &map, const stdr_msgs::ThermalSensorMsg &msg, const std::string &name, ros::NodeHandle &n)
Default constructor.
Definition: thermal.cpp:29
tf::StampedTransform _sensorTransform
True if sensor got the _sensorTransform.
Definition: sensor_base.h:135
virtual void updateSensorCallback()
Updates the sensor measurements.
Definition: thermal.cpp:61
TFSIMD_FORCE_INLINE const tfScalar & y() const
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
TFSIMD_FORCE_INLINE Vector3 & getOrigin()
static bool angCheck(float target_, float min_, float max_)
Checks if an angle is between two others. Supposes that min < max.
Definition: helper.h:37
Quaternion getRotation() const
void receiveThermalSources(const stdr_msgs::ThermalSourceVector &msg)
Receives the existent sound sources.
Definition: thermal.cpp:118
static Time now()
ros::Publisher _publisher
ROS tf listener.
Definition: sensor_base.h:131
~ThermalSensor(void)
Default destructor.
Definition: thermal.cpp:52


stdr_robot
Author(s): Manos Tsardoulias, Chris Zalidis, Aris Thallas
autogenerated on Mon Jun 10 2019 15:15:10