ARGoS 3
A parallel, multi-engine simulator for swarm robotics
footbot_base_ground_rotzonly_sensor.cpp
Go to the documentation of this file.
1
6
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
15namespace 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),
29 m_pcRNG(nullptr),
30 m_bAddNoise(false),
31 m_cSpace(CSimulator::GetInstance().GetSpace()) {}
32
33 /****************************************/
34 /****************************************/
35
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;
82 const CQuaternion& cEntityRot = m_pcEmbodiedEntity->GetOriginAnchor().Orientation;
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) {
102 m_tReadings[i].Value += m_pcRNG->Uniform(m_cNoiseRange);
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}
unsigned int UInt32
32-bit unsigned integer.
Definition datatypes.h:97
float Real
Collects all ARGoS code.
Definition datatypes.h:39
#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.
#define REGISTER_SENSOR(CLASSNAME, LABEL, IMPLEMENTATION, AUTHOR, VERSION, BRIEF_DESCRIPTION, LONG_DESCRIPTION, STATUS)
Registers a new sensor model inside ARGoS.
Definition sensor.h:63
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.
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.
The core class of ARGOS.
Definition simulator.h:62
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
static CRNG * CreateRNG(const std::string &str_category)
Creates a new RNG inside the given category.
Definition rng.cpp:347
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().
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.