# CBM: An IoT Enabled LiDAR Sensor for In-Field Crop Height and Biomass Measurements
## 2 Materials and Methods
### Scanning Geometry and Crop Height
Although the push-type mobile platform or vehicle was traversed at a near-constant speed (1.4 m/s), maintaining a uniform speed throughout the scan duration was not possible (as it is impractical) in field conditions. This leads to variable lengths of the scans for different plots. As data are collected at a constant rate from the LiDAR (60 Hz in this case), the plots over which the vehicle speed was slightly slower captured a greater number of samples, and vice-versa. The number of samples for all the plots ranged between 210 and 400 (Figure 6c). To adjust for this discrepancy, the lengthwise acquisition of the LiDAR samples was resampled at a constant rate of \(m=100\) samples per plot of 5 m in length (Figure 6d). Therefore, the array vector H is acquired m times, or the resampling frequency for each plot and \(n=8\) samples along the plot width direction, forming a \(m\times n\) matrix, represented by \(\mathbf{H_{plot}}\) in Equation (5). \[\mathbf{H_{plot}}=\left[ \begin{array}{ccc}h_{11}&\dots&h_{n1}\\ \vdots&\ddots&\vdots\\ h_{m1}&\dots&h_{mm}\end{array} \right]_{m\times n} \tag{5}\]  
As the detector elements are stacked at different angles (\(\alpha\), \(\beta\)) from the nadir, the widthwise footprint (w) increases progressively away from the nadir and reduces as the height (\(h\)) of the crop increases (Equation (4)). For an optimum medium-sized plot, the FoV  
Figure 6: Signal processing to extract the plot profiles. (**a**) The continuous height profile that was measured by the CBM sensor with spurious noise and false peaks, (**b**) removal of the noise, false peaks, and ground profile from the signal; the individual plots were segmented and classified using different colors, (**c**) the extracted plot profiles in high-resolution; the plot profiles varied between 210 and 400 samples due to the variation in the velocity of the mobile platform, and (**d**) the resampled profiles for each of the plot scans. of the sensor covers the entire width of the plot (Figure 7a,d). However, a short-sized plot is farther from the sensor, so its FoV covers beyond the width of the plot (Figure 7b,e). These segments on the edge are required to be ignored. Inversely, tall-sized plots are closer to the sensor so their FoV covers a limited width of the plot (Figure 7b,e). Therefore, extrapolation is required to account for the missed plants on the edge of the plots. A spatial resampling in the widthwise direction was applied to adjust for this mismatch. The dimension of the \(\mathbf{H_{plot}}\) matrix remains unchanged in this step but the internal values are revised. The \(\mathbf{H_{plot}}\) formulates the mathematical matrix formulation of the collected height profiles for each plot. The segmented \(\mathbf{H_{plot}}\) matrices were geolocated using the corresponding tags that were collected through the onboard GNSS receiver. The sensor system integrated the Navio2 GNSS receiver to configure the internal clock in sync with the GNSS time. Since the internal GNSS update rate was 5 Hz and did not have DGPS capabilities, there was not enough accuracy for geolocating the height profile, i.e., the entire array vector \(\mathbf{H}\), that was acquired over the plots. Instead, the GNSS timestamps over each plot provided the geolocation that was needed to register the segmented plot matrix \(\mathbf{H_{plot}}\). The geolocated \(\mathbf{H_{plot}}\) for the individual plots enabled further geospatial analysis to summarize the average height and volume of the crop, termed as BioVolume (BV). Therefore, the average height (\(h_{\text{avg}}\)) of each plot is calculated according to Equation (6). \[h_{\text{avg}}=\frac{1}{m\cdot n}\sum_{s=1}^{s=m}\sum_{\text{d}=1}^{d=n}h_{m,n} \tag{6}\]  
where, \(h_{m,n}\) is a specific element of the \(\mathbf{H_{plot}}\) matrix at \(m\)th row and \(n\)th column, d corresponds to the detector element, \(n\) is the total number of detectors (\(n=8\)), s represents the sample, and \(m\) represents the total number of samples per plot after resampling (\(m=100\)).