os1_packet.h
Go to the documentation of this file.
1 
5 #pragma once
6 
7 #include <array>
8 #include <cmath>
9 #include <cstdint>
10 #include <cstring>
11 
12 namespace ouster {
13 namespace OS1 {
14 
15 namespace {
16 
17 const int pixels_per_column = 64;
18 const int columns_per_buffer = 16;
19 
20 const int pixel_bytes = 12;
21 const int column_bytes = 16 + (pixels_per_column * pixel_bytes) + 4;
22 
23 const int encoder_ticks_per_rev = 90112;
24 
25 const std::array<float, OS1::pixels_per_column> beam_altitude_angles = {
26  16.611, 16.084, 15.557, 15.029, 14.502, 13.975, 13.447, 12.920,
27  12.393, 11.865, 11.338, 10.811, 10.283, 9.756, 9.229, 8.701,
28  8.174, 7.646, 7.119, 6.592, 6.064, 5.537, 5.010, 4.482,
29  3.955, 3.428, 2.900, 2.373, 1.846, 1.318, 0.791, 0.264,
30  -0.264, -0.791, -1.318, -1.846, -2.373, -2.900, -3.428, -3.955,
31  -4.482, -5.010, -5.537, -6.064, -6.592, -7.119, -7.646, -8.174,
32  -8.701, -9.229, -9.756, -10.283, -10.811, -11.338, -11.865, -12.393,
33  -12.920, -13.447, -13.975, -14.502, -15.029, -15.557, -16.084, -16.611,
34 };
35 const std::array<float, OS1::pixels_per_column> beam_azimuth_angles = {
36  3.164, 1.055, -1.055, -3.164, 3.164, 1.055, -1.055, -3.164,
37  3.164, 1.055, -1.055, -3.164, 3.164, 1.055, -1.055, -3.164,
38  3.164, 1.055, -1.055, -3.164, 3.164, 1.055, -1.055, -3.164,
39  3.164, 1.055, -1.055, -3.164, 3.164, 1.055, -1.055, -3.164,
40  3.164, 1.055, -1.055, -3.164, 3.164, 1.055, -1.055, -3.164,
41  3.164, 1.055, -1.055, -3.164, 3.164, 1.055, -1.055, -3.164,
42  3.164, 1.055, -1.055, -3.164, 3.164, 1.055, -1.055, -3.164,
43  3.164, 1.055, -1.055, -3.164, 3.164, 1.055, -1.055, -3.164,
44 };
45 
46 struct trig_table_entry {
50 };
51 
52 // table of vertical angle cos, sin, and horizontal offset of each pixel
53 static trig_table_entry trig_table[pixels_per_column];
54 }
55 
56 static bool init_tables() {
57  for (int i = 0; i < pixels_per_column; i++) {
58  trig_table[i] = {sinf(beam_altitude_angles[i] * 2 * M_PI / 360.0f),
59  cosf(beam_altitude_angles[i] * 2 * M_PI / 360.0f),
60  beam_azimuth_angles[i] * 2 * (float)M_PI / 360.0f};
61  }
62  return true;
63 }
64 
66 
67 // lidar column fields
68 inline const uint8_t* nth_col(int n, const uint8_t* udp_buf) {
69  return udp_buf + (n * column_bytes);
70 }
71 
72 inline uint64_t col_timestamp(const uint8_t* col_buf) {
73  uint64_t res;
74  memcpy(&res, col_buf, sizeof(uint64_t));
75  return res;
76 }
77 
78 inline float col_h_angle(const uint8_t* col_buf) {
79  uint32_t ticks;
80  memcpy(&ticks, col_buf + (3 * 4), sizeof(uint32_t));
81  return (2.0 * M_PI * ticks / (float)encoder_ticks_per_rev);
82 }
83 
84 inline float col_h_encoder_count(const uint8_t* col_buf) {
85  uint32_t res;
86  std::memcpy(&res, col_buf + (3 * 4), sizeof(uint32_t));
87  return res;
88 }
89 
90 inline uint32_t col_measurement_id(const uint8_t* col_buf) {
91  uint32_t res;
92  memcpy(&res, col_buf + (2 * 4), sizeof(uint32_t));
93  return res;
94 }
95 
96 inline uint32_t col_valid(const uint8_t* col_buf) {
97  uint32_t res;
98  memcpy(&res, col_buf + (196 * 4), sizeof(uint32_t));
99  return res;
100 }
101 
102 // lidar pixel fields
103 inline const uint8_t* nth_px(int n, const uint8_t* col_buf) {
104  return col_buf + 16 + (n * pixel_bytes);
105 }
106 
107 inline uint32_t px_range(const uint8_t* px_buf) {
108  uint32_t res;
109  memcpy(&res, px_buf, sizeof(uint32_t));
110  res &= 0x000fffff;
111  return res;
112 }
113 
114 inline uint16_t px_reflectivity(const uint8_t* px_buf) {
115  uint16_t res;
116  memcpy(&res, px_buf + 4, sizeof(uint16_t));
117  return res;
118 }
119 
120 inline uint16_t px_signal_photons(const uint8_t* px_buf) {
121  uint16_t res;
122  memcpy(&res, px_buf + 6, sizeof(uint16_t));
123  return res;
124 }
125 
126 inline uint16_t px_noise_photons(const uint8_t* px_buf) {
127  uint16_t res;
128  memcpy(&res, px_buf + 8, sizeof(uint16_t));
129  return res;
130 }
131 
132 // imu packets
133 inline uint64_t imu_sys_ts(const uint8_t* imu_buf) {
134  uint64_t res;
135  memcpy(&res, imu_buf, sizeof(uint64_t));
136  return res;
137 }
138 
139 inline uint64_t imu_accel_ts(const uint8_t* imu_buf) {
140  uint64_t res;
141  memcpy(&res, imu_buf + 8, sizeof(uint64_t));
142  return res;
143 }
144 
145 inline uint64_t imu_gyro_ts(const uint8_t* imu_buf) {
146  uint64_t res;
147  memcpy(&res, imu_buf + 16, sizeof(uint64_t));
148  return res;
149 }
150 
151 // imu linear acceleration
152 inline float imu_la_x(const uint8_t* imu_buf) {
153  float res;
154  memcpy(&res, imu_buf + 24, sizeof(float));
155  return res;
156 }
157 
158 inline float imu_la_y(const uint8_t* imu_buf) {
159  float res;
160  memcpy(&res, imu_buf + 28, sizeof(float));
161  return res;
162 }
163 
164 inline float imu_la_z(const uint8_t* imu_buf) {
165  float res;
166  memcpy(&res, imu_buf + 32, sizeof(float));
167  return res;
168 }
169 
170 // imu angular velocity
171 inline float imu_av_x(const uint8_t* imu_buf) {
172  float res;
173  memcpy(&res, imu_buf + 36, sizeof(float));
174  return res;
175 }
176 
177 inline float imu_av_y(const uint8_t* imu_buf) {
178  float res;
179  memcpy(&res, imu_buf + 40, sizeof(float));
180  return res;
181 }
182 
183 inline float imu_av_z(const uint8_t* imu_buf) {
184  float res;
185  memcpy(&res, imu_buf + 44, sizeof(float));
186  return res;
187 }
188 }
189 }
uint32_t col_measurement_id(const uint8_t *col_buf)
Definition: os1_packet.h:90
static bool init_tables()
Definition: os1_packet.h:56
float col_h_encoder_count(const uint8_t *col_buf)
Definition: os1_packet.h:84
f
float imu_la_x(const uint8_t *imu_buf)
Definition: os1_packet.h:152
float imu_av_y(const uint8_t *imu_buf)
Definition: os1_packet.h:177
static bool tables_initialized
Definition: os1_packet.h:65
float col_h_angle(const uint8_t *col_buf)
Definition: os1_packet.h:78
uint16_t px_noise_photons(const uint8_t *px_buf)
Definition: os1_packet.h:126
uint64_t imu_gyro_ts(const uint8_t *imu_buf)
Definition: os1_packet.h:145
uint64_t imu_sys_ts(const uint8_t *imu_buf)
Definition: os1_packet.h:133
float cos_beam_altitude_angles
Definition: os1_packet.h:48
uint64_t col_timestamp(const uint8_t *col_buf)
Definition: os1_packet.h:72
float imu_la_y(const uint8_t *imu_buf)
Definition: os1_packet.h:158
const uint8_t * nth_col(int n, const uint8_t *udp_buf)
Definition: os1_packet.h:68
uint16_t px_reflectivity(const uint8_t *px_buf)
Definition: os1_packet.h:114
float imu_av_x(const uint8_t *imu_buf)
Definition: os1_packet.h:171
float beam_azimuth_angles
Definition: os1_packet.h:49
const uint8_t * nth_px(int n, const uint8_t *col_buf)
Definition: os1_packet.h:103
float imu_la_z(const uint8_t *imu_buf)
Definition: os1_packet.h:164
uint64_t imu_accel_ts(const uint8_t *imu_buf)
Definition: os1_packet.h:139
float sin_beam_altitude_angles
Definition: os1_packet.h:47
Definition: os1.h:11
uint32_t px_range(const uint8_t *px_buf)
Definition: os1_packet.h:107
float imu_av_z(const uint8_t *imu_buf)
Definition: os1_packet.h:183
uint16_t px_signal_photons(const uint8_t *px_buf)
Definition: os1_packet.h:120
uint32_t col_valid(const uint8_t *col_buf)
Definition: os1_packet.h:96


ouster
Author(s): ouster developers
autogenerated on Mon Jun 10 2019 14:16:21