19 #ifndef SNARK_SENSORS_VELODYNE_THIN_THIN_H_
20 #define SNARK_SENSORS_VELODYNE_THIN_THIN_H_
23 #include <snark/sensors/velodyne/db.h>
24 #include <snark/sensors/velodyne/packet.h>
25 #include <snark/sensors/velodyne/impl/get_laser_return.h>
26 #include <snark/sensors/velodyne/thin/focus.h>
28 namespace snark {
namespace velodyne {
namespace thin {
31 void thin( velodyne::packet& packet,
float rate );
34 template <
typename Random >
35 void thin( velodyne::packet& packet,
float rate, Random& random );
38 template <
typename Random >
39 void thin( velodyne::packet& packet,
const focus& focus,
const db& db, Random& random );
42 std::size_t serialize(
const velodyne::packet& packet,
char* buf );
45 velodyne::packet deserialize(
const char* buf );
48 void deserialize( velodyne::packet& packet,
const char* buf );
51 enum { maxBlockBufferSize = 64 * 2 + 2 + 64 / 8 + 1 };
54 enum { maxBufferSize = 12 / 2 * maxBlockBufferSize + 1 };
56 template <
typename Random >
57 void thin( velodyne::packet& packet,
float rate, Random& random )
59 for(
unsigned int block = 0; block < packet.blocks.size(); ++block )
61 for(
unsigned int laser = 0; laser < packet.blocks[block].lasers.size(); ++laser )
63 if( random() > rate ) { packet.blocks[block].lasers[laser].range = 0; }
68 template <
typename Random >
69 void thin( velodyne::packet& packet,
const focus& focus,
const velodyne::db& db,
double angularSpeed, Random& random )
72 for(
unsigned int block = 0; block < packet.blocks.size(); ++block, upper = !upper )
74 for(
unsigned int laser = 0; laser < packet.blocks[block].lasers.size(); ++laser )
76 velodyne::laser_return r = impl::getlaser_return( packet, block, laser, boost::posix_time::not_a_date_time, angularSpeed );
77 double azimuth = db.lasers[r.id].azimuth( r.azimuth );
78 double range = db.lasers[r.id].range( r.range );
79 if( !focus.has( range, azimuth, 0, random ) ) { packet.blocks[block].lasers[laser].range = 0; }