Junhyeok Lee

Applies to v0.1.0.

Network · Visualisation

Two ways to watch the sensor streams. Foxglove talks to Unity directly and needs no ROS; rviz reads the ROS graph, so it needs ROS and, in practice, Linux.

Foxglove · port 8765

Unity carries its own Foxglove WebSocket server. No rosbridge, no container, no ROS install. This is the only practical live view on macOS.

Start it first. The bridge is stopped when the simulator launches. Open the Network panel and press Start on the Visualization (Foxglove) row. The status next to it reads ws://127.0.0.1:8765 • stopped until you do.

Then, in Foxglove Studio: Open ConnectionFoxglove WebSocket ws://localhost:8765.

  • Image panel for the cameras.
  • 3D panel for the LiDAR point cloud; set its display frame to odom, the same fixed frame the ROS tree uses.
  • Plot or Raw Messages for IMU and GNSS.

Segmentation is published as an indexed-colour PNG, so it renders in colour with no palette to configure and no decoding step.

Foxglove can also attach to rosbridge instead, as a Rosbridge connection on ws://localhost:9090. That shows the ROS graph rather than Unity's internal streams, which is what you want when debugging what your nodes actually receive. Plot /ego/cmd_applied to compare what the car obeyed against what you sent.

rviz · Linux

With rosbridge running and Unity connected, rviz2 sees the graph like any other ROS tool, with two things worth knowing before you add displays.

The Image display's topic dropdown will be empty. It only lists raw sensor_msgs/Image topics, and the simulator publishes CompressedImageonly. Rosbridge wraps every message in base64 JSON, and raw 1080p at 30 Hz would be a quarter gigabyte per second for one camera. Three ways to see the pictures, easiest first:

# 1 · rqt_image_view reads CompressedImage directly - pick the
#     /compressed topic from its own dropdown
ros2 run rqt_image_view rqt_image_view

# 2 · or bridge the stream back to a raw topic rviz can list
ros2 run image_transport republish compressed raw \
  --ros-args -r in/compressed:=/camera/<your-camera>/compressed \
             -r out:=/camera/<your-camera>/image_raw

Or use Foxglove (above). Its Image panel takes the compressed topic as-is.

Each camera also publishes a matching .../camera_info with its intrinsics, so depth-to-point-cloud and rectification pipelines have the calibration they need.

Set the fixed frame to odom. The simulator publishes the full frame tree on /tf at 30 Hz (see Frames & time), so the standard displays line up out of the box:

  • TF — draws the frame tree; base_link moves under odom as the car drives.
  • Odometry — on /ego/odom, draws the pose arrow and its trail.
  • PointCloud2 — on the LiDAR .../points topic; with the fixed frame set, the points hold their place in the world as the car moves through them.

rviz does not run cleanly on macOS, which is why the Foxglove path exists.