Go to the documentation of this file.
21 #ifndef VELODYNE_DRIVER__VELODYNE_TRANSLATOR_HPP_
22 #define VELODYNE_DRIVER__VELODYNE_TRANSLATOR_HPP_
25 #include <geometry_msgs/msg/point32.hpp>
43 namespace velodyne_driver
47 template<
typename SensorData>
85 uint8_t azimuth_bytes[2U];
93 uint8_t timestamp_bytes[4U];
94 uint8_t factory_bytes[2U];
101 : m_sensor_data(config.get_rpm())
104 init_intensity_table();
116 const auto flag_check_result = m_sensor_data.check_flag(block.
flag);
118 if (!flag_check_result.first) {
122 const auto num_banked_pts = flag_check_result.second;
127 const uint32_t
th = (azimuth_base + m_sensor_data.azimuth_offset(
130 const uint32_t phi = m_sensor_data.altitude(num_banked_pts, block_id, pt_id);
134 polar_to_xyz(pt, r,
th, phi);
136 pt.
id = m_sensor_data.seq_id(m_block_counter, pt_id);
141 if (
static_cast<float32_t>(m_block_counter) > m_sensor_data.num_blocks_per_revolution()) {
147 m_block_counter = uint16_t{0U};
154 static_assert(
sizeof(DataChannel) == 3U,
"Error velodyne data channel size is incorrect");
155 static_assert(
sizeof(DataBlock) == 100U,
"Error velodyne data block size is incorrect");
156 static_assert(
sizeof(Packet) == 1206U,
"Error velodyne packet size is incorrect");
161 "Number of points from one VLP16 packet cannot fit into a point block");
169 inline void polar_to_xyz(
172 const uint32_t th_ind,
173 const uint32_t phi_ind)
const
175 const float32_t r_xy = r_m * m_cos_table[phi_ind];
176 pt.
x = r_xy * m_cos_table[th_ind];
177 pt.
y = -r_xy * m_sin_table[th_ind];
178 pt.
z = r_m * m_sin_table[phi_ind];
185 inline float32_t compute_distance_m(
const uint8_t first,
const uint8_t second)
const
187 const uint32_t dist_scaled =
to_uint32(first, second);
188 return static_cast<float32_t>(dist_scaled) * m_sensor_data.distance_resolution();
192 inline T clamp(
const T val,
const T min,
const T max)
const
194 return (val < min) ? min : ((val > max) ? max : val);
198 VELODYNE_DRIVER_LOCAL
void init_trig_tables()
203 m_cos_table[idx] = cosf((
static_cast<float32_t>(idx)) * IDX2RAD);
204 m_sin_table[idx] = sinf((
static_cast<float32_t>(idx)) * IDX2RAD);
209 VELODYNE_DRIVER_LOCAL
void init_intensity_table()
212 m_intensity_table[idx] =
static_cast<float32_t>(idx);
217 static constexpr
float32_t TAU = 6.283185307179586476925286766559F;
221 std::array<float32_t, AZIMUTH_ROTATION_RESOLUTION> m_sin_table;
223 std::array<float32_t, AZIMUTH_ROTATION_RESOLUTION> m_cos_table;
225 std::array<float32_t, AZIMUTH_ROTATION_RESOLUTION> m_intensity_table;
228 uint16_t m_block_counter{0U};
229 SensorData m_sensor_data;
239 #endif // VELODYNE_DRIVER__VELODYNE_TRANSLATOR_HPP_
DataChannel channels[NUM_POINTS_PER_BLOCK]
Definition: velodyne_translator.hpp:86
float32_t x
Definition: types.hpp:50
Definition: output_type_trait.hpp:30
T
Definition: catr_diff.py:22
constexpr float32_t TAU
tau = 2 pi
Definition: types.hpp:44
float32_t get_rpm() const
Gets rpm value.
Definition: velodyne_translator.hpp:65
This file defines a driver for Velodyne LiDARs.
T clamp(T val, T min, T max)
Standard clamp implementation.
Definition: motion_common.hpp:142
uint16_t id
Definition: types.hpp:54
float32_t intensity
Definition: types.hpp:53
static constexpr uint32_t AZIMUTH_ROTATION_RESOLUTION
resolution of azimuth angle: number of points in a full rotation
Definition: common.hpp:48
Definition: velodyne_translator.hpp:54
corresponds to a velodyne data block.
Definition: velodyne_translator.hpp:82
uint8_t azimuth_bytes[2U]
Definition: velodyne_translator.hpp:85
static constexpr uint16_t POINT_BLOCK_CAPACITY
Stores basic configuration information, does some simple validity checking.
Definition: types.hpp:70
This file defines a driver for Velodyne LiDARs.
DataBlock blocks[NUM_BLOCKS_PER_PACKET]
Definition: velodyne_translator.hpp:92
uint8_t data[3U]
Definition: velodyne_translator.hpp:78
static constexpr uint16_t NUM_BLOCKS_PER_PACKET
number of data blocks per data packet
Definition: common.hpp:55
This file defines the lanelet2_map_provider_node class.
Definition: quick_sort.hpp:24
static constexpr uint16_t NUM_POINTS_PER_BLOCK
number of points stored in a data block
Definition: common.hpp:57
static constexpr uint16_t END_OF_SCAN_ID
Definition: types.hpp:55
This file defines a driver for Velodyne LiDARs.
float float32_t
Definition: types.hpp:36
stores a Velodyne data packet
Definition: velodyne_translator.hpp:90
Config(const float32_t rpm)
Constructor.
Definition: velodyne_translator.hpp:59
This class handles converting packets from a velodyne lidar into cartesian points.
Definition: velodyne_translator.hpp:48
static constexpr uint32_t NUM_INTENSITY_VALUES
how intensity is quantized: 1 byte = 256 possible values
Definition: common.hpp:52
corresponds to an individual laser's firing and return First two bytes are distance,...
Definition: velodyne_translator.hpp:76
uint32_t to_uint32(const uint8_t first, const uint8_t second)
computes 2 byte representation of two bytes from out of order velodyne packet
Definition: common.hpp:60
uint8_t flag[2U]
Definition: velodyne_translator.hpp:84
float32_t z
Definition: types.hpp:52
VelodyneTranslator(const Config &config)
default constructor
Definition: velodyne_translator.hpp:100
This file defines a driver for Velodyne LiDARs.
float32_t y
Definition: types.hpp:51
void convert(const Packet &pkt, std::vector< autoware::common::types::PointXYZIF > &output)
Convert a packet into a block of cartesian points.
Definition: velodyne_translator.hpp:110
th
Definition: catr_diff.py:22