footbot_base_ground_rotzonly_sensor.cpp
Go to the documentation of this file.
1 
7 #include <argos3/core/simulator/simulator.h>
8 #include <argos3/core/simulator/entity/composable_entity.h>
9 #include <argos3/core/simulator/entity/embodied_entity.h>
10 #include <argos3/core/simulator/entity/floor_entity.h>
11 #include <argos3/plugins/simulator/entities/ground_sensor_equipped_entity.h>
12 
14 
15 namespace argos {
16 
17  /****************************************/
18  /****************************************/
19 
20  static CRange<Real> UNIT(0.0f, 1.0f);
21 
22  /****************************************/
23  /****************************************/
24 
26  m_pcEmbodiedEntity(nullptr),
27  m_pcFloorEntity(nullptr),
28  m_pcGroundSensorEntity(nullptr),
29  m_pcRNG(nullptr),
30  m_bAddNoise(false),
31  m_cSpace(CSimulator::GetInstance().GetSpace()) {}
32 
33  /****************************************/
34  /****************************************/
35 
37  m_pcEmbodiedEntity = &(c_entity.GetComponent<CEmbodiedEntity>("body"));
38  m_pcGroundSensorEntity = &(c_entity.GetComponent<CGroundSensorEquippedEntity>("ground_sensors"));
41  }
42 
43  /****************************************/
44  /****************************************/
45 
47  try {
49  /* Parse noise level */
50  Real fNoiseLevel = 0.0f;
51  GetNodeAttributeOrDefault(t_tree, "noise_level", fNoiseLevel, fNoiseLevel);
52  if(fNoiseLevel < 0.0f) {
53  THROW_ARGOSEXCEPTION("Can't specify a negative value for the noise level of the foot-bot ground sensor");
54  }
55  else if(fNoiseLevel > 0.0f) {
56  m_bAddNoise = true;
57  m_cNoiseRange.Set(-fNoiseLevel, fNoiseLevel);
58  m_pcRNG = CRandom::CreateRNG("argos");
59  }
60  m_tReadings.resize(8);
61  /* sensor is enabled by default */
62  Enable();
63  }
64  catch(CARGoSException& ex) {
65  THROW_ARGOSEXCEPTION_NESTED("Initialization error in foot-bot rotzonly ground sensor", ex);
66  }
67  }
68 
69  /****************************************/
70  /****************************************/
71 
73  /* sensor is disabled--nothing to do */
74  if (IsDisabled()) {
75  return;
76  }
77  /*
78  * We make the assumption that the robot is rotated only wrt to Z
79  */
80  /* Get robot position and orientation */
81  const CVector3& cEntityPos = m_pcEmbodiedEntity->GetOriginAnchor().Position;
83  CRadians cRotZ, cRotY, cRotX;
84  cEntityRot.ToEulerAngles(cRotZ, cRotY, cRotX);
85  /* Set robot center */
86  CVector2 cCenterPos(cEntityPos.GetX(), cEntityPos.GetY());
87  /* Position of sensor on the ground after rototranslation */
88  CVector2 cSensorPos;
89  /* Go through the sensors */
90  for(UInt32 i = 0; i < m_tReadings.size(); ++i) {
91  /* Calculate sensor position on the ground */
92  cSensorPos = m_pcGroundSensorEntity->GetSensor(i+4).Offset;
93  cSensorPos.Rotate(cRotZ);
94  cSensorPos += cCenterPos;
95  /* Get the color */
96  const CColor& cColor = m_pcFloorEntity->GetColorAtPoint(cSensorPos.GetX(),
97  cSensorPos.GetY());
98  /* Set the reading */
99  m_tReadings[i].Value = cColor.ToGrayScale() / 255.0f;
100  /* Apply noise to the sensor */
101  if(m_bAddNoise) {
103  }
104  /* Set the final reading */
105  m_tReadings[i].Value = m_tReadings[i].Value < 0.5f ? 0.0f : 1.0f;
106  }
107  }
108 
109  /****************************************/
110  /****************************************/
111 
113  for(UInt32 i = 0; i < GetReadings().size(); ++i) {
114  m_tReadings[i].Value = 0.0f;
115  }
116  }
117 
118  /****************************************/
119  /****************************************/
120 
122  "footbot_base_ground", "rot_z_only",
123  "Carlo Pinciroli [ilpincy@gmail.com]",
124  "1.0",
125  "The foot-bot base ground sensor.",
126  "This sensor accesses the foot-bot base ground sensor. For a complete description\n"
127  "of its usage, refer to the ci_footbot_base_ground_sensor.h interface. For the XML\n"
128  "configuration, refer to the default ground sensor.\n",
129  "Usable"
130  );
131 
132 }
#define THROW_ARGOSEXCEPTION_NESTED(message, nested)
This macro throws an ARGoS exception with the passed message and nesting the passed exception.
#define THROW_ARGOSEXCEPTION(message)
This macro throws an ARGoS exception with the passed message.
unsigned int UInt32
32-bit unsigned integer.
Definition: datatypes.h:97
float Real
Collects all ARGoS code.
Definition: datatypes.h:39
The namespace containing all the ARGoS related code.
Definition: ci_actuator.h:12
void GetNodeAttributeOrDefault(TConfigurationNode &t_node, const std::string &str_attribute, T &t_buffer, const T &t_default)
Returns the value of a node's attribute, or the passed default value.
REGISTER_SENSOR(CEPuckProximityDefaultSensor, "epuck_proximity", "default", "Danesh Tarapore [daneshtarapore@gmail.com]", "1.0", "The E-Puck proximity sensor.", "This sensor accesses the epuck proximity sensor. For a complete description\n" "of its usage, refer to the ci_epuck_proximity_sensor.h interface. For the XML\n" "configuration, refer to the default proximity sensor.\n", "Usable")
ticpp::Element TConfigurationNode
The ARGoS configuration XML node.
virtual void Enable()
Enables updating of sensor information in the event loop.
Definition: ci_sensor.h:78
virtual void Init(TConfigurationNode &t_node)
Initializes the sensor from the XML configuration tree.
Definition: ci_sensor.h:54
bool IsDisabled() const
Definition: ci_sensor.h:86
Basic class for an entity that contains other entities.
CEntity & GetComponent(const std::string &str_component)
Returns the component with the passed string label.
This entity is a link to a body in the physics engine.
const SAnchor & GetOriginAnchor() const
Returns a const reference to the origin anchor associated to this entity.
CColor GetColorAtPoint(Real f_x, Real f_y)
Returns the color at the given point.
Definition: floor_entity.h:99
CQuaternion Orientation
The orientation of the anchor wrt the global coordinate system.
Definition: physics_model.h:53
CVector3 Position
The position of the anchor wrt the global coordinate system.
Definition: physics_model.h:51
The core class of ARGOS.
Definition: simulator.h:62
CFloorEntity & GetFloorEntity()
Returns the floor entity.
Definition: space.h:239
The exception that wraps all errors in ARGoS.
The basic color type.
Definition: color.h:25
Real ToGrayScale() const
Returns the color in grayscale.
Definition: color.h:68
It defines the basic type CRadians, used to store an angle value in radians.
Definition: angles.h:42
void ToEulerAngles(CRadians &c_z_angle, CRadians &c_y_angle, CRadians &c_x_angle) const
Definition: quaternion.h:172
void Set(const T &t_min, const T &t_max)
Definition: range.h:68
static CRNG * CreateRNG(const std::string &str_category)
Creates a new RNG inside the given category.
Definition: rng.cpp:347
CRadians Uniform(const CRange< CRadians > &c_range)
Returns a random value from a uniform distribution.
Definition: rng.cpp:87
A 2D vector class.
Definition: vector2.h:27
Real GetY() const
Returns the y coordinate of this vector.
Definition: vector2.h:110
CVector2 & Rotate(const CRadians &c_angle)
Rotates this vector by the wanted angle.
Definition: vector2.h:194
Real GetX() const
Returns the x coordinate of this vector.
Definition: vector2.h:94
A 3D vector class.
Definition: vector3.h:31
Real GetX() const
Returns the x coordinate of this vector.
Definition: vector3.h:105
Real GetY() const
Returns the y coordinate of this vector.
Definition: vector3.h:121
virtual void Init(TConfigurationNode &t_tree)
Initializes the sensor from the XML configuration tree.
CEmbodiedEntity * m_pcEmbodiedEntity
Reference to embodied entity associated to this sensor.
CGroundSensorEquippedEntity * m_pcGroundSensorEntity
Reference to ground sensor equipped entity associated to this sensor.
virtual void Reset()
Resets the sensor to the state it had just after Init().
CRandom::CRNG * m_pcRNG
Random number generator.
virtual void SetRobot(CComposableEntity &c_entity)
Sets the entity associated to this sensor.
virtual void Update()
Updates the state of the entity associated to this sensor, if the sensor is currently enabled.
CFloorEntity * m_pcFloorEntity
Reference to floor entity.