Repository navigation
Conversation
The sonar SLAM publishes the sensor's pose for every shot (SlamPoseTel), the changes to its point-cloud map (SlamMapUpdateTel) and the latest shot (SlamShotTel) on a publisher of its own, and answers GetSlamMapReq with the whole map and ResetSlamReq by starting a new one. The map is keyframes and submaps: a submap's points are in its anchor keyframe's frame, so a corrected trajectory moves them without sending them again. Map updates are numbered, so a client fetches the map once and applies the updates that follow it. Points are packed little-endian float32 (PointCloud) for use as typed arrays. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A viewer draws the sonar's field of view from the shot it is showing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ream SlamShot becomes SlamScan and says which sensor it comes from (SlamSensor: type, field of view, range), so a stereo camera can feed the same SLAM. The whole map is published on the SLAM publisher (SlamMapTel) when a client asks for it: GetSlamMapRep only acknowledges, so the request can go through the drone's own replier while the map stays off the telemetry socket. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SetSlamActiveReq starts the SLAM (its sensor switched on, a new map begun) or stops it (the sensor off, the map kept); SetSlamActiveRep says whether a SLAM answered and the state after. SlamStatusTel, on the SLAM publisher once a second and on a change, carries the state and the current map's id. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ange SlamSensorSettings holds one message per kind of sensor in a oneof, so a client shows the settings of the sensor the SLAM has: SlamSonar3dSettings carries a 3D sonar's frequency mode (Sonar3dFrequencyMode: low, wide and long; high, narrow, short and finer) and maximum range. SetSlamSensorSettingsReq changes them and its reply has the sensor's settings after; SlamStatusTel carries the current ones. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SlamPoseEstimate's pose is the sensor's. vehicle_pose is the drone's, back through how the sensor is mounted, and mount_tilt the tilt of a tilting mount used for it (degrees, positive up); both are unset when the mount is not known. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SlamPose's body is the one its field names (the sensor, or the drone for vehicle_pose). A 3D sonar's settings in a report use unspecified and 0 for what the sonar does not say, as a request uses them to leave a setting. Starting a SLAM that is running changes nothing; ResetSlamReq begins a new map. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SetSlamRecordingReq/Rep starts and stops a SLAM recording, as the map alone or with the sensor's data; SlamStatusTel reports it (SlamRecordingState). ResetPubFrequencyReq and ResetLogFrequencyReq put a message's publish and log rates back to the drone's defaults. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SlamMapFrame says how a map's frame lies in the world: gravity aligned, what x points along (the first scan's heading or the drone's compass), the magnetic declination the drone applied, the origin's depth and the map's start. SlamMap and SlamMapUpdate carry it, so a recording cut short has it too. SlamKeyframe.vehicle_pose is the drone's pose at the keyframe. A SLAM recording holds DroneInfoTel, naming its dive log. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every SLAM pose (estimate, keyframe, scan) is now the platform's: the drone's body frame when the sensor's mount is known, else the sensor itself (SlamMapFrame.platform). Each carries the sensor's id and its pose on the platform (mount); submaps hold one sensor's points in the platform's frame at their anchor. SlamStatusTel lists its sensors (SlamSensorStatus: description, settings, mount, tilt) in place of one sensor's settings, and SlamPoseEstimate has the covariance of the scan's match. This leaves room for a second sensor on the same drone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The drone's DVL nodes pass the DVL's frame through: x forward, y right, z down. Dive logs show it: the pilot's sway (positive right) and the DVL's y velocity have the same sign. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
🟡 Changes recommended
The pose documentation mislabels the platform pose as a sensor pose, which could cause consumers to omit the mount transform for tilted or offset sensors.
1 open issue
What changed in this PR
Adds sensor-neutral SLAM protocol definitions for mapping sensors on Blueye drones, covering map data, platform poses, telemetry, and control.
Changes:
- Defines SLAM poses, covariance, point clouds, map updates, sensor metadata, and coordinate frames.
- Adds SLAM telemetry and requests for activation, settings, map retrieval/reset, and recording.
- Adds publishing/logging frequency reset requests and corrects the DVL velocity frame comment from “y left” to “y right.”
| File | Description |
|---|---|
| protobuf_definitions/telemetry.proto | Adds SLAM pose, map, scan, and status telemetry. |
| protobuf_definitions/req_rep.proto | Adds SLAM control and frequency reset request/response messages. |
| protobuf_definitions/message_formats.proto | Defines shared SLAM data types and corrects the DVL frame comment. |
Review effort: Balanced
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pushes to sonar3d-slam publish 3.4.0-sonar3d-slam.<sha> under the sonar3d-slam tag, for the SLAM pull requests to build against; latest and the blueye-ts bump stay master's. The branch comes out of the trigger before merging. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SlamLoopClosure names the keyframe that closed a loop, the earlier one it matched near, and how far the correction moved and turned it. A map update carries the loops whose correction moved its keyframes; the whole map carries every loop. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
So another sensor (a 2D imaging multibeam, say) joins the SLAM without changing what is there: - SlamSensor names its guest port device (device_id), so a client can show the device itself. - SlamScan has its host time, to line it up with the sensor's own stream. - SetSlamSensorSettingsReq can name the sensor (sensor_id); without one the settings go to the sensor of their kind, as before. - The estimate's match fields no longer assume a 3D sonar's points: match_rms is the matched points' residual against the map. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SlamPoseTel's comment says the estimate is the platform's (the drone's) pose. A branch prerelease prefixes the commit hash with "g": an all-digit hash with a leading zero is not a valid SemVer identifier. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
🔵 Needs a closer look
The shared SLAM wire contract depends on four inaccessible implementation changes, requiring domain-owner review of producer/consumer agreement on transforms, covariance conventions, map sequencing, and recording semantics.
No open issues 🎉
2 resolved since last review
Review effort: Balanced
From Juan's review: - SlamSubmap holds one kind of content in a oneof (points today, same field numbers), and the map-part and removal rules say nothing of points. - GetSlamMapReq says which map and sequence the client holds; the reply says whether the missed updates come again or the whole map, in how many parts. - SlamStatusTel carries the map's frame. - ResetSlamReq's map_id 0 resets only when there is no map yet. - PointCloud says what count validates; doc fixes for recordings, covariance and the pose's platform. - The SLAM's enums and messages move to slam.proto. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks Juan. All three main points are in: protocol 69e4406, be-slam 402b47da (p2_drone#1216), and viewer c7dc324d (p2-django#732, on the 3.4.0-sonar3d-slam.g69e44062 prerelease).
Smaller notes:
|
jp-pino
left a comment
There was a problem hiding this comment.
Thanks, this looks good. I went through 69e4406 and be-slam's 402b47da: the submap oneof, the catch-up (the reply logic in map_server.cpp follows the request/reply comments exactly), the part rule, the frame in the status, slam.proto and the smaller notes are all as discussed. Keeping SlamMap and SlamMapUpdate separate and keeping replace/removed_submap_ids are fine by me.
One small comment, not blocking: SlamMap.map_id and GetSlamMapRep.map_id say "0 before the first scan", but be-slam gives a new map its id at reset, before its first scan (Slam::reset), so after a reset the id is non-zero with no keyframes yet. Maybe "0 when the SLAM has no map", which also matches the new ResetSlamReq wording.
Approving on the understanding that the sonar3d-slam trigger in ci-typescript.yaml comes out before merging.
|
I generated 1.
2. Where is the SLAM publisher? The 3. Can a submap be split across The joining rule says repeated fields are concatenated in part order. If one submap's points can span two parts, the client gets two 4. These are in the diff but missing from the description, and they have nothing to do with SLAM. Please add a line about them so they make it into the changelog. 5. Small things
Docs rendering (no change needed here)
|
From Sindre's review on the Python side: - SlamSensor.type is sensor_type (proto-plus reserves type); same number. - slam.proto says where the SLAM publishes (5561/9989) and how its requests reach it. - A submap is never split across map parts. - "no other sensor of that model"; ResetSlamRep has available first, as the other replies do. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks Sindre, very useful. Changes are in 32827e4, with be-slam d9e2866f (p2_drone#1216) and the viewer eb76d477 (p2-django#732, on the 3.4.0-sonar3d-slam.g32827e44 prerelease).
Thanks for taking the docs rendering and the |
A new map gets its id when it starts, before its first scan. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks Juan. Fixed in 7eed67c: |
sensor_id is 3 and the points 4, as the fields read; the simulated sensor type's reservation goes, as nothing was released with it. Recordings convert with sbez_submaps.py. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
🔵 Needs a closer look
SLAM wire-contract compatibility requires maintainer validation because the four linked producer and client repositories were inaccessible, preventing checks of endpoint routing, coordinate frames, and map synchronization.
No open issues 🎉
1 resolved since last review
Review effort: Balanced
SlamStatusTel says the newest update's sequence (a client that has less missed one), what the estimate rests on besides its sensors (SlamAiding: orientation source, depth, DVL velocity) and whether the back end was dropped. SlamPoseEstimate names the keyframe it was placed against, so a client can move kept poses with a loop closure. The SLAM's replies say why they did not do what was asked (SlamRequestError). GetSlamMapRep: the whole map may be one made earlier, with the updates after it. All additions: recordings stay valid. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SetSlamSensorSettingsReq without sensor_id goes to the SLAM's sensor of the settings' kind when it has exactly one; with several, the request must name one, else NO_SUCH_SENSOR. Comments only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ange check in CI A SlamMap sent in parts has every field that is not repeated in its first part (a later part may repeat map_id, sequence and part_count); a client takes those from part 0 and concatenates the repeated fields in part order. proto3 cannot tell a field set to its default from an unset one, so "the part that sets it" could not hold for a field added later. CI checks the definitions against master with buf breaking (buf.yaml): a renumbered, retyped or removed field fails; additions pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A client groups parts by them and drops a set whose parts disagree, so parts of two snapshots are never put together as one map. be-slam already sets them in every part. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>



Messages for a SLAM on the drone: it builds a 3D map from a mapping sensor (the Water Linked Sonar 3D-15 first) and tracks the drone in it.
SlamPoseTel), map updates and the whole map (SlamMapUpdateTel,SlamMapTel), the latest scan (SlamScanTel) and the SLAM's state, sensors and recording (SlamStatusTel).SetSlamActiveReq,SetSlamSensorSettingsReq,ResetSlamReq,GetSlamMapReq,SetSlamRecordingReq).SlamLoopClosure) on the map update whose correction they make, and all of them in the whole map, so a viewer can show what a loop corrected.DvlVelocitycomment: y is right, not left.ResetPubFrequencyReq/RepandResetLogFrequencyReq/Represet a message's publishing or logging rate to the drone's default (empty: every message), so a client that raised a rate (as the SLAM's recording does for the dive log) can put it back.Related: BluEye-Robotics/libblunux#527
Related: BluEye-Robotics/p2_drone#1216
Related: BluEye-Robotics/p2-django#732
Related: BluEye-Robotics/meta-blueye#535
🤖 Generated with Claude Code