base
LaserScan.hpp
Go to the documentation of this file.
1 #ifndef BASE_SAMPLES_LASER_H__
2 #define BASE_SAMPLES_LASER_H__
3 
4 #include <vector>
5 #include <Eigen/Geometry>
6 #include <base/Float.hpp>
7 #include <boost/cstdint.hpp>
8 #include <base/Time.hpp>
9 #include <base/Deprecated.hpp>
10 
11 namespace base { namespace samples {
15  TOO_FAR = 1, // too far
16  TOO_NEAR = 2,
21  };
22 
23  struct LaserScan {
24  typedef boost::uint32_t uint32_t;
25 
31 
36  double start_angle;
37 
41 
44  double speed;
45 
48  std::vector<uint32_t> ranges;
49 
51  uint32_t minRange;
52 
54  uint32_t maxRange;
55 
60  std::vector<float> remission;
61 
63  : start_angle(0), angular_resolution(0), speed(0), minRange(0), maxRange(0) {}
64 
65  bool isValidBeam(const unsigned int i) const;
66 
67  //resets the sample
68  void reset();
69 
70  bool isRangeValid(uint32_t range) const;
71 
79  template<typename T>
80  void convertScanToPointCloud(std::vector<T> &points,
81  const Eigen::Affine3d& transform = Eigen::Affine3d::Identity(),
82  bool skip_invalid_points = true)const
83  {
84  points.clear();
85 
86  //give the vector a hint about the size it might be
87  points.reserve(ranges.size());
88 
89  //this is optimized for runtime
90  //moving the check for skip_invalid_points
91  //out of the loop speeds up the execution
92  //time by ~25 %
93  if(!skip_invalid_points)
94  {
95  for(unsigned int i = 0; i < ranges.size(); i++) {
96  Eigen::Vector3d point;
97  if(getPointFromScanBeamXForward(i, point)) {
98  point = transform * point;
99  points.push_back(point);
100  } else {
101  points.push_back(Eigen::Vector3d(base::unknown<double>(), base::unknown<double>(), base::unknown<double>()));
102  }
103  }
104  } else {
105  for(unsigned int i = 0; i < ranges.size(); i++) {
106  Eigen::Vector3d point;
107  if(getPointFromScanBeamXForward(i, point)) {
108  point = transform * point;
109  points.push_back(point);
110  }
111  }
112  }
113  }
114 
119  bool getPointFromScanBeamXForward(const unsigned int i, Eigen::Vector3d &point) const;
120 
124  bool getPointFromScanBeam(const unsigned int i, Eigen::Vector3d &point) const;
125 
129  std::vector<Eigen::Vector3d> convertScanToPointCloud(const Eigen::Affine3d& transform) const BASE_TYPES_DEPRECATED;
130  };
131 }} // namespaces
132 
133 #endif
bool getPointFromScanBeam(const unsigned int i, Eigen::Vector3d &point) const
Definition: LaserScan.cpp:44
Definition: LaserScan.hpp:20
#define BASE_TYPES_DEPRECATED
Definition: Deprecated.hpp:5
Definition: LaserScan.hpp:23
boost::uint32_t uint32_t
Definition: LaserScan.hpp:24
Definition: Time.hpp:11
bool isRangeValid(uint32_t range) const
Definition: LaserScan.cpp:24
bool isValidBeam(const unsigned int i) const
Definition: LaserScan.cpp:7
Definition: LaserScan.hpp:16
uint32_t minRange
Definition: LaserScan.hpp:51
double angular_resolution
Definition: LaserScan.hpp:40
double speed
Definition: LaserScan.hpp:44
double start_angle
Definition: LaserScan.hpp:36
std::vector< uint32_t > ranges
Definition: LaserScan.hpp:48
Definition: LaserScan.hpp:15
bool getPointFromScanBeamXForward(const unsigned int i, Eigen::Vector3d &point) const
Definition: LaserScan.cpp:31
Definition: LinearAngular6DCommand.hpp:8
Definition: LaserScan.hpp:18
LaserScan()
Definition: LaserScan.hpp:62
Eigen::Matrix< double, 3, 1, Eigen::DontAlign > Vector3d
Definition: Eigen.cpp:12
void reset()
Definition: LaserScan.cpp:14
LASER_RANGE_ERRORS
Definition: LaserScan.hpp:14
Eigen::Transform< double, 3, Eigen::Affine > Affine3d
Definition: Eigen.cpp:20
Definition: LaserScan.hpp:19
void convertScanToPointCloud(std::vector< T > &points, const Eigen::Affine3d &transform=Eigen::Affine3d::Identity(), bool skip_invalid_points=true) const
Definition: LaserScan.hpp:80
uint32_t maxRange
Definition: LaserScan.hpp:54
std::vector< float > remission
Definition: LaserScan.hpp:60
Definition: LaserScan.hpp:17
Time time
Definition: LaserScan.hpp:30