1 #ifndef VELODYNE_POINTCLOUD_DATACONTAINERBASE_H
2 #define VELODYNE_POINTCLOUD_DATACONTAINERBASE_H
36 #include <geometry_msgs/TransformStamped.h>
37 #include <velodyne_msgs/VelodyneScan.h>
39 #include <Eigen/Dense>
50 DataContainerBase(
const double max_range,
const double min_range,
const std::string& target_frame,
51 const std::string& fixed_frame,
const unsigned int init_width,
const unsigned int init_height,
52 const bool is_dense,
const unsigned int scans_per_packet,
int fields, ...)
53 :
config_(max_range, min_range, target_frame, fixed_frame, init_width, init_height, is_dense, scans_per_packet)
57 cloud.fields.reserve(fields);
60 for (
int i = 0; i < fields; ++i)
63 std::string name(va_arg(vl,
char*));
64 int count(va_arg(vl,
int));
69 cloud.point_step = offset;
70 cloud.row_step = init_width *
cloud.point_step;
103 virtual void setup(
const velodyne_msgs::VelodyneScan::ConstPtr& scan_msg)
108 cloud.header.stamp = scan_msg->header.stamp;
115 virtual void addPoint(
float x,
float y,
float z,
const uint16_t ring,
const uint16_t azimuth,
const float distance,
116 const float intensity,
const float time) = 0;
138 <<
" Velodyne points, time: " <<
cloud.header.stamp);
163 tf_buffer = std::make_shared<tf2_ros::Buffer>();
174 void configure(
const double max_range,
const double min_range,
const std::string fixed_frame,
175 const std::string target_frame)
188 const std::string& source_frame,
const ros::Time& time)
192 ROS_ERROR(
"tf buffer was not initialized yet");
196 geometry_msgs::TransformStamped
msg;
212 const geometry_msgs::Quaternion& quaternion =
msg.transform.rotation;
213 Eigen::Quaternionf rotation(quaternion.w, quaternion.x, quaternion.y, quaternion.z);
215 const geometry_msgs::Vector3& origin =
msg.transform.translation;
216 Eigen::Translation3f translation(origin.x, origin.y, origin.z);
218 matrix = translation * rotation;
246 Eigen::Vector3f p = Eigen::Vector3f(x, y, z);
274 #endif // VELODYNE_POINTCLOUD_DATACONTAINERBASE_H