Skip to main content

color cycle

You add streams, system auto assigns colors
session=plot output=none
output named colors can also be used explicitly. when you pin a series to one of the named colors, the auto-cycle excludes it for the remaining series, so you never end up with two lines that share a color by accident.
session=plot output=none
output

speed plot

you can assign different axes to different time series, label them etc
session=robotdata output=none
output Let’s find some plants!
session=robotdata
output We can be pretty sure the robot saw some plants by peaks at beginning and end of data, but this graph doesn’t look great, why? Embeddings are calculated according to some minimum picture brightness. Completely dark images are both useless and also semantically close to everything. Let’s investigate how our embedding stream relates to image brightness:
session=robotdata
output We see that stuff isn’t embedded below some minimum brightness. Let’s now fill the gaps in our semantic graph a bit, looks super ugly above, we will tell plotter to consider unmapped values as zero and connect values that are within 7.5 seconds, smooth with 5 second time window, and normalize the data
session=robotdata
output Looks better, these are some very obvious peaks, I’m curious let’s see what was captured then. Let’s auto-detect the peaks, extract images from those moments, and run a 2D detector
skip session=robotdata
output output output

Which peaks are significant?

We got 15 peaks back, we ran a detector on all of them so we can start projecting into 3D but let’s say we want some sort of pre-filter of just globally significant peaks. we can see most peaks prominence sits around 0.02–0.03 and only a couple (0.067 at t=37s, 0.047 at t=240s) really stand out. We might want to auto detect those. significant() replaces that guesswork by thresholding on the distribution of prominences itself. Default outlier detection uses MAD (median absolute deviation) Once we put the surviving peaks on the timeline we get two very obvious plants.
skip session=robotdata
output output Rule of thumb: keep a small absolute floor on peaks(prominence=...) to reject shape-noise, then let significant() pick the statistical cutoff.

Semantic peak analysis

Let’s focus on those two peaks. load all images in the vicinity of a detection, We’ll also pull all lidar frames in their vicinity and reconstruct global maps for those areas.
skip session=robotdata
output output

3D Projection

skip session=robotdata output=none
output

TODO further steps

  • These are 3D bounding boxes with associated pointclouds, render in rerun
  • Some basic statistical outlier filters - we have many overlaping detections here and we can be pretty sure there are plants right of the robot, but unclear about left.
  • Now that we have 3d locations in space, we can load all camera images observing detections in space (not just rely on radius around the embedding peak) see in how many of these images we actually detect an object. (another strategy for false positive filtering)