[Sim Theme C] Turtlesim visualizer (VNC)#24
Conversation
- Changed default Gazebo render engine reference from Jetty to Ionic in documentation. - Updated Dockerfile for ROS service to set default ROS_DISTRO to Kilted. - Modified DDS discovery configuration to reflect Kilted changes. - Adjusted simulator Dockerfile to set GZ_RELEASE to Ionic and added ROS_DISTRO as an argument. - Revised Copilot instructions and agent expectations to align with Kilted and Ionic. - Added new Business Requirements Document (BRD) for UbeROS Simulation and Visualization, outlining the need for a pluggable simulator framework and native web visualization for Gazebo.
…tion - Introduced a comprehensive PRD outlining the goals, requirements, and architecture for the UbeROS simulation and visualization framework. - Defined the context, core opportunity, and user personas to clarify the project's objectives. - Detailed functional and non-functional requirements, including a pluggable simulator framework, launch menu, and ROS 2 integration. - Specified the solution architecture, including component models and discovery systems. - Included operational considerations, risks, and rollout phases to guide implementation.
All open questions resolved (gzweb spike, kilted/ionic pairing, configurable autostart, drop ros-gz from ros image). Status -> Approved.
…ata-driven menu (FR-A1..A4)
a3449f1 to
95c331e
Compare
…turtlesim/novnc route (FR-C1..C4)
🤖 Automated PR reviewTurtlesim visualizer — single-container Xvfb + turtlesim_node + openbox + x11vnc + websockify, streamed over noVNC through a lazy-DNS proxy route. Base: #22. Findings
✅ nginx lazy-resolver route ( Recommendation: Approve after removing/repairing the dead trap. |
1 similar comment
🤖 Automated PR reviewTurtlesim visualizer — single-container Xvfb + turtlesim_node + openbox + x11vnc + websockify, streamed over noVNC through a lazy-DNS proxy route. Base: #22. Findings
✅ nginx lazy-resolver route ( Recommendation: Approve after removing/repairing the dead trap. |
jmservera
left a comment
There was a problem hiding this comment.
🤖 Automated line-anchored review — see the summary comment for the full findings table.
There was a problem hiding this comment.
Pull request overview
Adds a ROS-native Turtlesim “lightweight simulator” that renders a GUI in-container (Xvfb + Openbox + x11vnc + websockify/noVNC) and exposes it through the existing reverse proxy under a dedicated route, alongside related planning and ROS/Gazebo baseline documentation touch-ups.
Changes:
- Add a new
turtlesimcontainer image and entrypoint that runs the full VNC/noVNC pipeline plus a Fast DDS discovery-server client profile. - Extend the nginx reverse proxy to serve
/sim/turtlesim/novnc/with lazy DNS resolution so the proxy can start even whenturtlesimis not running. - Define the
turtlesimservice incompose.yaml(on-demand via thesimulatorsprofile) and enable it in the simulator registry.
Reviewed changes
Copilot reviewed 10 out of 10 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| services/turtlesim/openbox-rc.xml | Minimal Openbox rules to maximize/undecorate the turtlesim window for noVNC display. |
| services/turtlesim/entrypoint.sh | Entrypoint orchestration for Xvfb/Openbox/turtlesim/x11vnc/websockify. |
| services/turtlesim/Dockerfile | New image packaging turtlesim + VNC/noVNC toolchain and DDS profile. |
| services/turtlesim/config/dds_discovery.xml | Fast DDS discovery-server client profile for ROS-native graph participation. |
| services/proxy/nginx.conf | Add /sim/turtlesim/novnc/ reverse-proxy route with Docker DNS resolver. |
| services/control/simulators.js | Enable the turtlesim simulator entry in the registry. |
| docs/specs/01-Init-research.md | Update research notes around images/pairings (Ionic/Harmonic references). |
| docs/plans/sim-theme-c-turtlesim.md | Add Theme C plan stub for the turtlesim visualizer lane. |
| docs/decisions/ADR-001-ros-distro.md | Update distro decision narrative (Kilted baseline) and fallback guidance text. |
| compose.yaml | Add the turtlesim service under the simulators profile with healthcheck and networks. |
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
|
@claude[agent] resolve the two remaining PR comments about the entrypoint.sh sigkill issue. |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 10 out of 10 changed files in this pull request and generated 1 comment.
Comments suppressed due to low confidence (2)
services/turtlesim/entrypoint.sh:64
- The TERM/INT trap is ineffective because
exec websockify ...replaces the bash PID 1 process, so the trap never runs andturtlesim_node(and the other background processes) may be left running until Docker sends SIGKILL. Keep bash as PID 1 and explicitly manage the websockify child so signals trigger cleanup.
# Forward termination to the turtlesim node for a clean shutdown.
trap 'kill -TERM "${TURTLE_PID}" 2>/dev/null || true' TERM INT
# Serve noVNC static assets and bridge WebSocket -> VNC on :6080 (foreground).
exec websockify \
docs/decisions/ADR-001-ros-distro.md:18
- The ADR’s Context section now frames the candidates as Kilted/Jazzy/Humble, but immediately after it references the ROS 2 “Lyrical package path” and later says to treat Jazzy/Ionic as the fallback while “the Lyrical package path remains blocked…”. That historical note is useful, but it’s confusing without explicitly stating that Lyrical was a previously-considered candidate and that the Jetty/Noble constraint is only relevant in that context.
Kilted offers the longest runway but its ecosystem package coverage
(`rosbridge-suite`, `ros-gz`) was unverified at research time.
During development we confirmed that the Jetty image uses Ubuntu Noble, which blocks the ROS 2 Lyrical package path on that image. Gazebo Ionic remains compatible with both Jazzy and Kilted, so it was retained while the repository baseline stayed on Kilted.
Agent-Logs-Url: https://github.com/jmservera/UbeROS/sessions/ea3c2cc2-8101-4c48-822e-ef58d430ee45 Co-authored-by: jmservera <8036360+jmservera@users.noreply.github.com>
Fixed in 6782f78. Replaced |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 10 out of 10 changed files in this pull request and generated 2 comments.
Comments suppressed due to low confidence (1)
docs/specs/01-Init-research.md:1686
- This footnote sentence is internally ambiguous: it says the source “records … Kilted in November 2026” and also “Kilted ending in approximately May 2031” without clarifying what the November 2026 date represents (release? EOL? something else). Please rewrite to disambiguate the meaning of each date (or remove the ambiguous one) so the citation remains self-consistent.
[^ros-eol]: ROS 2 lifecycle schedule: <https://endoflife.date/ros-2>, last updated 2026-06-01 and accessed 2026-07-17. It records Iron EOL in November 2024, Humble in May 2027, Jazzy in May 2029, Kilted in November 2026, and Kilted ending in approximately May 2031. REP-2000 had no Kilted section at the research date.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 10 out of 10 changed files in this pull request and generated 2 comments.
Comments suppressed due to low confidence (1)
services/turtlesim/Dockerfile:22
- The Dockerfile comment says procps/pgrep are used for a health check, but this container’s health check is curl-based (see compose.yaml) and there’s no pgrep usage in the turtlesim image. This makes the comment misleading and pulls an extra package unnecessarily.
# turtlesim + the VNC toolchain (Xvfb framebuffer, openbox window manager,
# x11vnc export, novnc/websockify browser bridge). x11-utils provides xdpyinfo
# for the framebuffer readiness probe; curl is used by the container health check.
RUN apt-get update \
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 10 out of 10 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (1)
services/turtlesim/entrypoint.sh:71
- x11vnc is started in the background but its PID is never tracked. If x11vnc crashes/exits, the entrypoint will keep running (websockify can still serve static assets), so the container may stay "healthy" while the VNC backend is dead and users just see connection failures. Track x11vnc’s PID and include it in the TERM/INT trap and wait set so the container restarts cleanly when the VNC server dies.
trap 'kill -TERM "${TURTLE_PID}" "${WEBSOCKIFY_PID}" 2>/dev/null || true' TERM INT
wait -n "${TURTLE_PID}" "${WEBSOCKIFY_PID}"
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 10 out of 10 changed files in this pull request and generated 1 comment.
Comments suppressed due to low confidence (1)
services/turtlesim/entrypoint.sh:54
- x11vnc is started in the background but its PID is never tracked. If x11vnc exits/crashes, the container can keep running (websockify + turtlesim still up) while the noVNC WebSocket backend is broken, which makes failures harder to detect/recover. Capture the x11vnc PID and include it in the TERM/INT trap and the
wait -nset so the container stops (and can restart) when x11vnc dies.
x11vnc \
-display "${DISPLAY_NUM}" \
-nopw \
-listen localhost \
-xkb \
Implements Theme C of the Simulation & Visualization PRD (FR-C1..C4). Lane 3 (Turtlesim backend) — service/route infra parallelizable immediately; menu wiring depends on Themes A/B. Adds a turtlesim service (Xvfb+x11vnc+websockify) and its noVNC proxy route, ROS-native. Plan: docs/plans/sim-theme-c-turtlesim.md. Draft.