A Go port(ish) of Voxblox modified to use sparse leaves and transmit mesh updates over gRPC as glTF (glb).
I wrote this to learn golang so some or all of it might make your eyes bleed.
graph LR
tsdfIntegrator[TSDF Integrator]
tsdfMap[TSDF Map]
meshIntegrator[Mesh Integrator]
meshLayer[Mesh Layer]
Sensor -- Pointcloud2 --> tsdfIntegrator
poseEstimate -- 6DOF Pose --> tsdfIntegrator
tsdfIntegrator --> tsdfMap --> tsdfIntegrator
tsdfMap -- Updated Blocks --> meshIntegrator
meshLayer -- Set Updated False --> tsdfMap
meshIntegrator --> meshLayer -. gRPC .-> glTF(glTF Mesh Blocks)
go test go-voxblox
Download the Cow and Lady Dataset and decompress (required for real time playback) with:
rosbag decompress data.bag
Settings are configured in voxblox.yaml
.
The simple
and fast
integrators are available however the code runs the fast
integrator by default.
Start a roscore with:
roscore
Start the node with:
go build go-voxblox
Optionally start the rerun viewer with:
cd viewer
python3 main.py
Start the bag playback with:
rosbag play --clock data.bag
You should see logs similar to the following:
2023/12/12 20:58:34 Convert PointCloud2: 2.312166ms
2023/12/12 20:58:34 Integrate Fast: 6.760125ms
2023/12/12 20:58:34 Convert PointCloud2: 3.882959ms
2023/12/12 20:58:34 Integrate Fast: 13.282292ms
2023/12/12 20:58:34 Integrate Mesh: 2.588875ms
If you need to regenerate the protobuf and gRPC files you can do so with the following command:
protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
proto/mesh_service.proto
- Merged integrator weights and speed
- Better / more unit tests
- Cache distant blocks with protobuf
- Logging
- System tests
- Stress test / map size
- ICP (kiss-icp?)
- Block updated status per subscriber