microphone.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 
35  const nav_msgs::OccupancyGrid& map,
36  const stdr_msgs::SoundSensorMsg& msg,
37  const std::string& name,
38  ros::NodeHandle& n)
39  : Sensor(map, name, n, msg.pose, msg.frame_id, msg.frequency)
40  {
41  _description = msg;
42 
43  _publisher = n.advertise<stdr_msgs::SoundSensorMeasurementMsg>
44  ( _namespace + "/" + msg.frame_id, 1 );
45 
47  "stdr_server/sound_sources_list",
48  1,
50  this);
51  }
52 
58  {
59 
60  }
61 
67  {
68  if (sound_sources_.sound_sources.size() == 0) return;
69 
70  stdr_msgs::SoundSensorMeasurementMsg measuredSourcesMsg;
71 
72  measuredSourcesMsg.header.frame_id = _description.frame_id;
73  measuredSourcesMsg.sound_dbs = 0;
74 
75  float max_range = _description.maxRange;
76  float sensor_th = tf::getYaw(_sensorTransform.getRotation());
77  float min_angle = sensor_th - _description.angleSpan / 2.0;
78  float max_angle = sensor_th + _description.angleSpan / 2.0;
79 
81  for(unsigned int i = 0 ; i < sound_sources_.sound_sources.size() ; i++)
82  {
84  float sensor_x = _sensorTransform.getOrigin().x();
85  float sensor_y = _sensorTransform.getOrigin().y();
86  float dist = sqrt(
87  pow(sensor_x - sound_sources_.sound_sources[i].pose.x, 2) +
88  pow(sensor_y - sound_sources_.sound_sources[i].pose.y, 2)
89  );
90  if(dist > max_range)
91  {
92  continue;
93  }
94 
96  float ang = atan2(
97  sound_sources_.sound_sources[i].pose.y - sensor_y,
98  sound_sources_.sound_sources[i].pose.x - sensor_x);
99 
100  if(!stdr_robot::angCheck(ang, min_angle, max_angle))
101  {
102  continue;
103  }
104 
105  if(dist > 0.5)
106  {
107  measuredSourcesMsg.sound_dbs += sound_sources_.sound_sources[i].dbs *
108  pow(0.5, 2) / pow(dist, 2);
109  }
110  else
111  {
112  measuredSourcesMsg.sound_dbs += sound_sources_.sound_sources[i].dbs;
113  }
114  }
115 
116  measuredSourcesMsg.header.stamp = ros::Time::now();
117  measuredSourcesMsg.header.frame_id =
118  _namespace + "_" + _description.frame_id;
119  _publisher.publish( measuredSourcesMsg );
120  }
121 
125  void SoundSensor::receiveSoundSources(const stdr_msgs::SoundSourceVector& msg)
126  {
127  sound_sources_ = msg;
128  }
129 
130 } // namespace stdr_robot
SoundSensor(const nav_msgs::OccupancyGrid &map, const stdr_msgs::SoundSensorMsg &msg, const std::string &name, ros::NodeHandle &n)
Default constructor.
Definition: microphone.cpp:34
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
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
void receiveSoundSources(const stdr_msgs::SoundSourceVector &msg)
Receives the existent sound sources.
Definition: microphone.cpp:125
TFSIMD_FORCE_INLINE const tfScalar & x() const
tf::StampedTransform _sensorTransform
True if sensor got the _sensorTransform.
Definition: sensor_base.h:135
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()
stdr_msgs::SoundSensorMsg _description
< sound sensor description
Definition: microphone.h:82
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
static Time now()
ros::Subscriber sound_sources_subscriber_
The currently existent sources.
Definition: microphone.h:85
~SoundSensor(void)
Default destructor.
Definition: microphone.cpp:57
virtual void updateSensorCallback()
Updates the sensor measurements.
Definition: microphone.cpp:66
stdr_msgs::SoundSourceVector sound_sources_
Definition: microphone.h:88
ros::Publisher _publisher
ROS tf listener.
Definition: sensor_base.h:131


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