2 #include <argos3/core/simulator/simulator.h>
3 #include <argos3/core/simulator/space/positional_indices/positional_index.h>
4 #include <argos3/core/simulator/entity/composable_entity.h>
5 #include <argos3/core/simulator/entity/embodied_entity.h>
6 #include <argos3/plugins/simulator/entities/led_entity.h>
7 #include <argos3/plugins/simulator/entities/omnidirectional_camera_equipped_entity.h>
8 #include <argos3/plugins/simulator/media/led_medium.h>
25 Real f_noise_std_dev) :
27 m_cOmnicamEntity(c_omnicam_entity),
28 m_cEmbodiedEntity(c_embodied_entity),
29 m_cControllableEntity(c_controllable_entity),
30 m_bShowRays(b_show_rays),
31 m_fDistanceNoiseStdDev(f_noise_std_dev),
33 m_pcRootSensingEntity = &m_cEmbodiedEntity.
GetParent();
34 if(m_fDistanceNoiseStdDev > 0.0f) {
39 while(! m_tBlobs.empty()) {
40 delete m_tBlobs.back();
51 while(m_pcRootOfLEDEntity->
HasParent()) m_pcRootOfLEDEntity = &m_pcRootOfLEDEntity->
GetParent();
52 if(m_pcRootSensingEntity == m_pcRootOfLEDEntity) {
59 m_cLEDRelativePos -= m_cCameraPos;
60 m_cLEDRelativePosXY.
Set(m_cLEDRelativePos.
GetX(),
61 m_cLEDRelativePos.
GetY());
62 if(
Abs(m_cLEDRelativePos.
GetX()) < m_fGroundHalfRange &&
63 Abs(m_cLEDRelativePos.
GetY()) < m_fGroundHalfRange &&
64 m_cLEDRelativePos.
GetZ() < m_cCameraPos.
GetZ() &&
69 if(m_fDistanceNoiseStdDev > 0.0f) {
71 m_cLEDRelativePosXY.
Length() * m_pcRNG->
Gaussian(m_fDistanceNoiseStdDev),
77 m_cLEDRelativePosXY.
Length() * 100.0f));
87 while(! m_tBlobs.empty()) {
88 delete m_tBlobs.back();
91 m_fGroundHalfRange = f_ground_half_range;
94 m_cCameraPos += m_cOmnicamEntity.
GetOffset();
95 m_cOcclusionCheckRay.
SetStart(m_cCameraPos);
104 Real m_fGroundHalfRange;
106 CEntity* m_pcRootSensingEntity;
114 CRay3 m_cOcclusionCheckRay;
115 Real m_fDistanceNoiseStdDev;
123 m_pcOmnicamEntity(nullptr),
124 m_pcControllableEntity(nullptr),
125 m_pcEmbodiedEntity(nullptr),
126 m_pcLEDIndex(nullptr),
127 m_pcEmbodiedIndex(nullptr),
159 Real fDistanceNoiseStdDev = 0;
162 std::string strMedium;
172 fDistanceNoiseStdDev);
202 cCameraPos.
GetZ() * 0.5f),
203 CVector3(fGroundHalfRange, fGroundHalfRange, cCameraPos.
GetZ() * 0.5f),
242 "colored_blob_omnidirectional_camera",
"rot_z_only",
243 "Carlo Pinciroli [ilpincy@gmail.com]",
246 "A generic omnidirectional camera sensor to detect colored blobs.",
247 "This sensor accesses an omnidirectional camera that detects colored blobs. The\n"
248 "sensor returns a list of blobs, each defined by a color and a position with\n"
249 "respect to the robot reference point on the ground. In controllers, you must\n"
250 "include the ci_colored_blob_omnidirectional_camera_sensor.h header.\n\n"
252 "This sensor is disabled by default, and must be enabled before it can be\n"
255 "REQUIRED XML CONFIGURATION\n\n"
259 " <my_controller ...>\n"
263 " <colored_blob_omnidirectional_camera implementation=\"rot_z_only\"\n"
264 " medium=\"leds\" />\n"
268 " </my_controller>\n"
270 " </controllers>\n\n"
272 "The 'medium' attribute must be set to the id of the leds medium declared in the\n"
273 "<media> section.\n\n"
275 "OPTIONAL XML CONFIGURATION\n\n"
277 "It is possible to draw the rays shot by the camera sensor in the OpenGL\n"
278 "visualization. This can be useful for sensor debugging but also to understand\n"
279 "what's wrong in your controller. In OpenGL, the rays are drawn in cyan when\n"
280 "they are not obstructed and in purple when they are. In case a ray is\n"
281 "obstructed, a black dot is drawn where the intersection occurred.\n"
282 "To turn this functionality on, add the attribute \"show_rays\" as in this\n"
287 " <my_controller ...>\n"
291 " <colored_blob_omnidirectional_camera implementation=\"rot_z_only\"\n"
292 " medium=\"leds\" />\n"
293 " show_rays=\"true\" />\n"
297 " </my_controller>\n"
299 " </controllers>\n\n"
301 "It is possible to add uniform noise to the blobs, thus matching the\n"
302 "characteristics of a real robot better. This can be done with the attribute\n"
303 "\"noise_std_dev\".\n\n"
306 " <my_controller ...>\n"
310 " <colored_blob_omnidirectional_camera implementation=\"rot_z_only\"\n"
311 " medium=\"leds\" />\n"
312 " noise_std_dev=\"0.1\" />\n"
316 " </my_controller>\n"
318 " </controllers>\n\n"
320 "OPTIMIZATION HINTS\n\n"
322 "1. For small swarms, enabling the sensor (and therefore causing ARGoS to\n"
323 " update its readings each timestep) unconditionally does not impact performance too\n"
324 " much. For large swarms, it can impact performance, and selectively\n"
325 " enabling/disabling the sensor according to when each individual robot needs it\n"
326 " (e.g., only when it is looking for an LED equipped entity) can increase performance\n"
327 " by only requiring ARGoS to update the readings on timesteps they will be used.\n",
#define THROW_ARGOSEXCEPTION_NESTED(message, nested)
This macro throws an ARGoS exception with the passed message and nesting the passed exception.
float Real
Collects all ARGoS code.
The namespace containing all the ARGoS related code.
bool GetClosestEmbodiedEntityIntersectedByRay(SEmbodiedEntityIntersectionItem &s_item, const CRay3 &c_ray)
Returns the closest intersection with an embodied entity to the ray start.
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.
CRadians NormalizedDifference(const CRadians &c_angle1, const CRadians &c_angle2)
Calculates the normalized difference between the given angles.
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.
Real Tan(const CRadians &c_radians)
Computes the tangent of the passed value in radians.
T Abs(const T &t_v)
Returns the absolute value of the passed argument.
void GetNodeAttribute(TConfigurationNode &t_node, const std::string &str_attribute, T &t_buffer)
Returns the value of a node's attribute.
virtual void Enable()
Enables updating of sensor information in the event loop.
virtual void Init(TConfigurationNode &t_node)
Initializes the sensor from the XML configuration tree.
virtual void Disable()
Disables updating of sensor information in the event loop.
Basic class for an entity that contains other entities.
CEntity & GetComponent(const std::string &str_component)
Returns the component with the passed string label.
An entity that contains a pointer to the user-defined controller.
void AddCheckedRay(bool b_obstructed, const CRay3 &c_ray)
Adds a ray to the list of checked rays.
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.
void Disable()
Disables the entity.
void Enable()
Enables the entity.
CComposableEntity & GetParent()
Returns this entity's parent.
bool HasParent() const
Returns true if this entity has a parent.
const CVector3 & GetPosition() const
CQuaternion Orientation
The orientation of the anchor wrt the global coordinate system.
CVector3 Position
The position of the anchor wrt the global coordinate system.
T & GetMedium(const std::string &str_id)
Returns a reference to a medium.
static CSimulator & GetInstance()
Returns the instance to the CSimulator class.
A data structure that contains positional entities.
The exception that wraps all errors in ARGoS.
It defines the basic type CRadians, used to store an angle value in radians.
static const CRange< CRadians > UNSIGNED_RANGE
The unsigned normalization range [0:TWO_PI].
void ToEulerAngles(CRadians &c_z_angle, CRadians &c_y_angle, CRadians &c_x_angle) const
void SetEnd(const CVector3 &c_end)
void SetStart(const CVector3 &c_start)
static CRNG * CreateRNG(const std::string &str_category)
Creates a new RNG inside the given category.
Real Gaussian(Real f_std_dev, Real f_mean=0.0f)
Returns a random value from a Gaussian distribution.
CRadians Uniform(const CRange< CRadians > &c_range)
Returns a random value from a uniform distribution.
Real Length() const
Returns the length of this vector.
CRadians Angle() const
Returns the angle of this vector.
void Set(Real f_x, Real f_y)
Sets the vector contents from Cartesian coordinates.
Real GetX() const
Returns the x coordinate of this vector.
Real GetY() const
Returns the y coordinate of this vector.
Real GetZ() const
Returns the z coordinate of this vector.
std::vector< SBlob * > TBlobList
Vector of pointers to colored blobs.
An SBlob represents a generic colored 2D segment in the image.
virtual ~COmnidirectionalCameraLEDCheckOperation()
virtual bool operator()(CLEDEntity &c_led)
COmnidirectionalCameraLEDCheckOperation(CCI_ColoredBlobOmnidirectionalCameraSensor::TBlobList &t_blobs, COmnidirectionalCameraEquippedEntity &c_omnicam_entity, CEmbodiedEntity &c_embodied_entity, CControllableEntity &c_controllable_entity, bool b_show_rays, Real f_noise_std_dev)
void Setup(Real f_ground_half_range)
virtual void Disable()
Disables updating of sensor information in the event loop.
virtual void Reset()
Resets the sensor to the state it had just after Init().
CPositionalIndex< CLEDEntity > * m_pcLEDIndex
virtual void Enable()
Enables updating of sensor information in the event loop.
virtual ~CColoredBlobOmnidirectionalCameraRotZOnlySensor()
CColoredBlobOmnidirectionalCameraRotZOnlySensor()
virtual void Update()
Updates the state of the entity associated to this sensor, if the sensor is currently enabled.
virtual void SetRobot(CComposableEntity &c_entity)
Sets the entity associated to this sensor.
COmnidirectionalCameraLEDCheckOperation * m_pcOperation
virtual void Destroy()
Destroys the sensor.
virtual void Init(TConfigurationNode &t_tree)
Initializes the sensor from the XML configuration tree.
COmnidirectionalCameraEquippedEntity * m_pcOmnicamEntity
CControllableEntity * m_pcControllableEntity
CEmbodiedEntity * m_pcEmbodiedEntity
const CColor & GetColor() const
Returns the current color of the LED.
const CRadians & GetAperture() const
Returns the aperture of the visibility cone of the omnidirectional camera.
const CVector3 & GetOffset() const
Returns the offset of the omnidirectional camera with respect to the reference point.