17 #define APPERTURE 4.712385
40 m_sensorPose(0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
42 m_beamApperture(.25*
M_PI/180.0),
47 CIbeoLuxETH::~CIbeoLuxETH()
57 void CIbeoLuxETH::dataCollection()
60 unsigned char msgIn[1], Header[20], ScanListHeader[44], ScanPointData[10];
61 unsigned int datatype, numScanpoints, angleTicks, SPlayer, SPdistance;
63 unsigned char msg[32];
66 m_client.connect(m_ip, m_port);
69 makeCommandHeader(msg);
71 m_client.writeAsync(&msg[0], 32);
74 makeCommandHeader(msg);
75 makeStartCommand(msg);
76 m_client.writeAsync(&msg[0], 28);
83 m_client.readAsync(msgIn, 1, 100, 10);
87 m_client.readAsync(msgIn, 1, 100, 10);
91 m_client.readAsync(msgIn, 1, 100, 10);
95 m_client.readAsync(msgIn, 1, 100, 10);
99 m_client.readAsync(Header, 20, 100, 10);
100 datatype = Header[10] * 0x100 + Header[11];
123 std::cerr <<
"UNKNOWN packet of type " << hex << datatype <<
" received!!\n";
129 CObservation3DRangeScanPtr newObs = CObservation3DRangeScan::Create();
130 newObs->hasPoints3D =
true;
131 newObs->maxRange = 200.00;
133 m_client.readAsync(ScanListHeader, 44, 10, 10);
136 numScanpoints = ScanListHeader[29] * 0x100 + ScanListHeader[28];
137 angleTicks = ScanListHeader[23] * 0x100 + ScanListHeader[22];
139 for (
unsigned int i = 0; i < numScanpoints; ++i)
141 bool dropPacket =
false;
143 m_client.readAsync(ScanPointData, 10, 10, 10);
144 SPlayer = ScanPointData[0] & 0x0F;
146 SPHangle = (char)ScanPointData[3] * 0x100 + ScanPointData[2];
147 SPdistance = ScanPointData[5] * 0x100 + ScanPointData[4];
155 if ((SPHangle < -((
int)angleTicks)/2) || (SPHangle > (int)angleTicks/2))
160 if ((SPdistance < 30) || (SPdistance > 20000))
170 CPoint3D cartesianPoint = convertToCartesian(
171 convertLayerToRad(SPlayer),
172 convertTicksToHRad(SPHangle, angleTicks),
176 newObs->points3D_x.push_back(cartesianPoint.
x());
177 newObs->points3D_y.push_back(cartesianPoint.
y());
178 newObs->points3D_z.push_back(cartesianPoint.z());
183 appendObservation( newObs );
191 makeCommandHeader(msg);
192 makeStopCommand(msg);
193 m_client.writeAsync(&msg[0], 28);
201 float rho, phi, theta;
205 phi = -hrad+(
M_PI/2);
208 x = rho * sin (phi) * cos (theta);
209 y = rho * sin (phi) * sin (theta);
216 double CIbeoLuxETH::convertTicksToHRad(
int hticks,
int hticksPerRotation)
218 return M_PI*2 * hticks / hticksPerRotation;
221 double CIbeoLuxETH::convertLayerToRad(
int scanlayer)
228 vangle = -0.02094395103;
231 vangle = -0.006981317009;
234 vangle = 0.006981317009;
237 vangle = 0.02094395103;
241 std::cerr <<
"Layer: " << scanlayer <<
"! Returning " << vangle <<
" as angle.\n";
251 float pose_x, pose_y, pose_z, pose_yaw, pose_pitch, pose_roll;
252 bool faillNotFound =
false;
253 pose_x = configSource.
read_float(iniSection,
"pose_x",0,faillNotFound);
254 pose_y = configSource.
read_float(iniSection,
"pose_y",0,faillNotFound);
255 pose_z = configSource.
read_float(iniSection,
"pose_z",0,faillNotFound);
256 pose_yaw = configSource.
read_float(iniSection,
"pose_yaw",0,faillNotFound);
257 pose_pitch = configSource.
read_float(iniSection,
"pose_pitch",0,faillNotFound);
258 pose_roll = configSource.
read_float(iniSection,
"pose_roll",0,faillNotFound);
260 m_sensorPose =
CPose3D( pose_x, pose_y, pose_z,
265 void CIbeoLuxETH::makeCommandHeader(
unsigned char*
buffer)
294 void CIbeoLuxETH::makeStartCommand(
unsigned char*
buffer)
305 void CIbeoLuxETH::makeStopCommand(
unsigned char*
buffer)
316 void CIbeoLuxETH::makeTypeCommand(
unsigned char*
buffer)
334 void CIbeoLuxETH::initialize()
347 void CIbeoLuxETH::doProcess()
#define IMPLEMENTS_GENERIC_SENSOR(class_name, NameSpace)
This must be inserted in all CGenericSensor classes implementation files:
const unsigned char SearchForFE
const unsigned char SearchForAF
const unsigned char SearchForC0
const unsigned char PacketFound
const unsigned char SaveData
const unsigned char SearchForC2
This "software driver" implements the communication protocol for interfacing a Ibeo Lux laser scanner...
A class used to store a 3D point.
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
double x() const
Common members of all points & poses classes.
This class allows loading and storing values and vectors of different types from a configuration text...
float read_float(const std::string §ion, const std::string &name, float defaultValue, bool failIfNotFound=false) const
GLsizei const GLchar ** string
double BASE_IMPEXP distance(const TPoint2D &p1, const TPoint2D &p2)
Gets the distance between two points in a 2D space.
TThreadHandle createThreadFromObjectMethod(CLASS *obj, void(CLASS::*func)(PARAM), PARAM param)
Creates a new thread running a non-static method (so it will have access to "this") from another meth...
void BASE_IMPEXP joinThread(TThreadHandle &threadHandle)
Waits until the given thread ends.
void BASE_IMPEXP sleep(int time_ms) MRPT_NO_THROWS
An OS-independent method for sending the current thread to "sleep" for a given period of time.
Contains classes for various device interfaces.
This namespace contains representation of robot actions and observations.
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
This namespace provides a OS-independent interface to many useful functions: filenames manipulation,...
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values,...
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.