STATUS: PAUSED/DEFERRED (2026-05-18). v2.4 SysNav infra modules + tests are in-tree and green (215 tests pass), but T6 bridge wiring and G5 launch file are NOT delivered. This pipeline does not run end-to-end yet. Deferred to v2.5. See progress.md.
Vector OS Nano consumes the SysNav project as its standard semantic
scene-graph backend. SysNav runs as a sibling ROS2 workspace; we
subscribe to its topic outputs through a thin Apache-2.0 adapter inside
vector_os_nano/integrations/sysnav_bridge/.
License boundary. SysNav is licensed PolyForm-Noncommercial-1.0.0. Vector OS Nano is Apache-2.0. We do not copy any SysNav source files into this repository. Users install SysNav themselves; both are kept in their own directories, both are loaded from a single ROS2 environment at runtime, and only ROS2 messages cross the boundary.
| SysNav publishes | Type | Use in Vector OS Nano |
|---|---|---|
/object_nodes_list |
tare_planner/ObjectNodeList |
Per-object 3D pose + 8-corner bbox + label + status (new / persistent / moving / disappeared) → seeds WorldModel.ObjectState |
/object_type_query |
tare_planner/ObjectType |
Forwards a VLM-classified object type request — we can react with a skill or ignore |
/obj_points |
sensor_msgs/PointCloud2 |
Per-object pointcloud cluster — optional, used by pick_top_down if available |
/obj_boxes |
visualization_msgs/MarkerArray |
RViz visualisation, passthrough |
/obj_labels |
visualization_msgs/MarkerArray |
RViz visualisation, passthrough |
/annotated_image |
sensor_msgs/Image |
Debug / GUI visualisation |
| SysNav consumes | Type | What we publish |
|---|---|---|
/target_object_instruction |
tare_planner/TargetObjectInstruction |
Vector OS Nano translates user intent (e.g. "go find the blue trash can in the kitchen") into this message; SysNav's VLM reasoning + planner take over |
/registered_scan |
sensor_msgs/PointCloud2 |
Lidar (Livox Mid-360) — provided by the SLAM stack, not by us |
/state_estimation |
nav_msgs/Odometry |
SLAM odom — same |
/camera/image |
sensor_msgs/Image |
RGB stream — provided by the camera driver |
The L1 (VLM Reasoning) node also subscribes to /instruction,
/anchor_object, /room_navigation_query, /object_type_query,
etc. — see src/vlm_node/vlm_node/vlm_reasoning_node.py in the SysNav
repo for the full surface.
These come from SysNav, not Vector OS Nano. Without them, SysNav will not start cleanly and our bridge will receive nothing.
| Component | Why | Notes |
|---|---|---|
| Livox Mid-360 lidar | All branches use livox_ros_driver2 + arise_slam_mid360 for SLAM; semantic mapping clusters lidar voxels |
No RealSense / monocular fallback exists in any SysNav branch as of 2026-04. |
| Ricoh Theta Z1 360-degree camera | cloud_image_fusion.py projects panoramic RGB onto each lidar voxel; narrow-FoV cameras under-cover |
Other 360-degree cameras may work if they expose an equivalent equirectangular topic. |
| Compute | RTX 4090 desktop + Intel NUC onboard (per SysNav README) | Yusen's RTX 5080 covers the desktop side. |
| Network | Wired or stable WiFi between robot, NUC, and desktop | SysNav's domain_bridge config splits topics by domain. |
For Go2 specifically, use the unitree_go2 branch — it adds
unitree_webrtc_ros for cmd_vel → Go2 sport_cmd over WebRTC.
If the hardware is not yet available, the bringup adapter still imports cleanly (no ROS2 import at module load time) and will simply log "no scene graph received" until topics start flowing. Tests use mocked subscribers — no hardware needed for unit / integration tests.
Three terminals, in this order:
cd ~/Desktop/SysNav
git checkout unitree_go2 # match Go2 platform
source /opt/ros/jazzy/setup.bash
source install/setup.bash
./system_real_robot_with_exploration_planner_go2.sh
# Wait until you see:
# [semantic_mapping_node]: object_nodes_list publisher created
# [vlm_reasoning_node]: ready
# [tare_planner]: readyOr for desk-side / bagfile testing:
./system_bagfile_with_exploration_planner.sh ~/path/to/bag.db3cd ~/Desktop/vector_os_nano
source /opt/ros/jazzy/setup.bash
source ~/Desktop/SysNav/install/setup.bash # for tare_planner.msg
.venv-nano/bin/activate
vector-cli go2sim # or: vector-cli connect-go2vector-cli startup probes for tare_planner.msg.ObjectNodeList
imports. If absent, the bridge logs a warning and degrades to
world_model populated only by built-in MJCF auto-registration —
behaviour identical to today.
ros2 run rviz2 rviz2 -d ~/Desktop/SysNav/src/exploration_planner/tare_planner/rviz/tare_planner_ground.rviz SysNav workspace
│
│ /object_nodes_list (ObjectNodeList)
│ /room_nodes_list (RoomNodeList)
▼
Vector OS Nano: integrations/sysnav_bridge/
│
┌─────────────────────┼─────────────────────┐
│ ObjectNode adapter │ RoomNode adapter │
│ ↓ │ ↓ │
│ ObjectState │ SceneGraph rooms │
└──────────┬──────────┴─────────┬───────────┘
▼ ▼
world_model SceneGraph
│ │
└────────┬───────────┘
▼
DetectSkill / PickTopDownSkill / NavigateSkill
MobilePickSkill / ExploreSkill / PlaceTopDownSkill
tare_planner/ObjectNode |
vector_os_nano.core.world_model.ObjectState |
Notes |
|---|---|---|
object_id[0] |
object_id |
SysNav merges duplicate detections; we keep the primary ID |
label |
label |
Lower-cased, en/cn alias-mapped via existing label_to_en_query |
position.x/y/z |
x/y/z |
Already in map frame — no further calibration |
bbox3d[0..7] |
properties["bbox3d_corners"] |
8 corners, oriented; preserved as raw for grasp planning |
status ∈ {new, persistent, moving, disappeared} |
state ∈ {on_table, grasped, placed, unknown} |
Mapped: disappeared → unknown, moving → unknown, others → on_table (or current state if grasped/placed) |
cloud (PointCloud2) |
properties["pointcloud_topic"] |
Optional; if present, top-down pick can use it for centroid refinement |
header.stamp |
last_seen |
Float seconds |
is_asked_vlm |
properties["asked_vlm"] |
bool |
viewpoint_id |
properties["viewpoint_id"] |
int |
ObjectNode does not carry a single confidence scalar — SysNav's
SingleObject.weighted_class_scores is internal. We default
ObjectState.confidence = 1.0 and refine via is_asked_vlm (0.7 if
unverified, 1.0 after VLM confirmation). Tunable.
SysNav publishes ObjectNodeList with depth-200 reliable. We match
with depth-50 reliable. No need for BEST_EFFORT — these are
per-room updates, not high-frequency telemetry.
tests/integration/test_sysnav_bridge_object_node_mapping.py— build a mockObjectNodeListpayload (without importingtare_planner.msg; we type-shadow the schema intopic_interfaces.pyfor test isolation), feed through the adapter, assertObjectStatefields populate correctly.tests/integration/test_sysnav_bridge_status_transitions.py— statusdisappearedremoves the object after a TTL;movingkeeps it but lowers confidence.
scripts/mock_sysnav_publisher.py— replay a recordedObjectNodeListJSON throughrclpyso the bridge can be exercised without SysNav running. Useful for nightly CI.
- Bringup order from §3, then
vector-cli > 抓起蓝色瓶子should resolveworld_modelagainst SysNav-populated entries within 2 seconds of the dog seeing the table.
- Yusen to confirm Go2 sensor stack matches SysNav requirements
(Livox + 360-degree camera). If a different lidar / camera is
installed, we may need to publish synthetic
/registered_scanand/camera/imagefrom RealSense — NOT in v3.0 scope. - SysNav's
unitree_go2branch addsunitree_webrtc_rosforcmd_vel— overlaps with our existingGo2ROS2Proxywalk path. Reconciliation deferred (one or the other should own the topic). - Scene graph live updates (status=moving) interact with
MobilePickSkill._resolve_targetcache — invalidate on each/object_nodes_listcallback, do not cache stale positions. - VLM reasoning replication: SysNav has its own VLM node; Vector OS Nano has its own LLM brain (Anthropic / OpenAI). Decide which layer answers natural-language queries — see ADR (TBD) for coordination policy.
- SysNav repo (sibling lab): https://github.com/zwandering/SysNav
- SysNav paper: arXiv 2603.06914
- SysNav project page: https://cmu-vln.github.io/
- Vector Navigation Stack (same lab): https://github.com/VectorRobotics/vector_navigation_stack