Releases: StvLi/dsh-ros2
Release list
dsh-ros2 v0.10.0
New: ros2_install — FishROS one-click ROS2 install (interactive)
When the host has no ROS2, the agent can — after user confirmation via approval — launch the FishROS one-click installer (http://fishros.com/install) and drive it interactively to completion.
- 38th tool
ros2_install(L2, approval-gated):check: probes ROS2 state — usable / installed-but-not-sourced (detects/opt/rossetup.bash, advisesrosSetup, prevents accidental re-install) / absentstart(approval): launches the installer in an interactive PTY session (supports sudo password prompts and numeric menus)send/status/stop: drive menus, watch progress, cancel anytime
scripts/pty_session.py: pure-stdlib PTY session manager (daemonized; non-blocking master).installerparam allows local path / file:// overrides (mirrors, offline, tests).- Tests: 83 pass incl. end-to-end mock-installer menu flow; machine smoke verifies installed-but-not-sourced refusal. Docs + skill updated.
dsh-ros2 v0.9.3
GPU passthrough rendering verified (30 Hz cap reached)
Tested the GPU-passthrough plan on the NVIDIA RTX 4060 Ti: the offscreen renderer now reaches the full 30 Hz request rate (was ~22 Hz on llvmpipe), with no extra pipeline cost (GPU->CPU readback 1-2ms vs ~20ms saved per frame).
Fix
NVIDIA GLX context creation failed with BadValue: rviz's default FSAA=4 makes OGRE select 32-bit ARGB-visual fbconfigs, which NVIDIA GLX refuses for GL 3.0 core contexts (verified: only 24-bit / samples=0 configs create). Fix: RenderSystem::disableAntiAliasing() in rviz_offscreen_node.
Results (1000x750, 0.39M-tris low-poly, rate=30)
| metric | llvmpipe | NVIDIA GPU |
|---|---|---|
| steady fps (static) | 21.5-22.9 Hz | 30.0 Hz |
| steady fps (motion) | 21.5 Hz | 30.0 Hz |
| onUpdate (render) | ~30 ms | ~9 ms |
| llvmpipe regression | - | 22.4 Hz (no degradation) |
Full report: docs/gpu-passthrough-test.md (hardware, 3-layer troubleshooting: NVML/DRM-perms/32-bit-visual GLX, usage).
dsh-ros2 v0.9.2
Fixed: double rendering eliminated (30Hz request reaches ~22Hz, 2x)
Profiling at rate=30 exposed the real bottleneck: VisualizationManager::onUpdate() already renders the scene (ogre_root_->renderOneFrame(), gated by render_requested_ / >10ms wall time), and the main loop then called win->render() again - a second render of the same scene every frame (+31ms/frame).
Results (0.39M-tris low-poly, 1000x750, rate=30)
| config | fps |
|---|---|
| original (double render + events every frame) | 11.1 Hz |
| + events throttle (5 frames) | 14.2 Hz |
| + remove redundant win->render() | 21.5-24.2 Hz (motion 21.5 Hz steady, 400+ frames) |
| regression: 10Hz request | 10.3 Hz (at cap) |
- Published frame is pixel-identical to before (verified fg 73331).
- TF refresh stays at full rate (onUpdate every frame; the v0.9.1 onUpdate/2 compromise is no longer needed).
- Code comment documents the cause. Docs: architecture.md 5.2, robot-state-vision-test.md 8.4.
dsh-ros2 v0.9.1
Performance: 30 Hz request measurement + loop-budget optimizations
Measuring at rate=30 revealed the frame rate is capped by fixed per-loop overhead independent of the requested rate (10 Hz and 30 Hz both landed near 11 Hz): onUpdate ~30ms + processEvents ~30ms + render ~31ms.
Optimizations
- Throttle app.processEvents() to every 5 frames - per-frame Qt event processing triggers paint events causing a second OGRE render (~30ms/frame). events 30ms -> 0ms.
- vm.onUpdate() every 2 frames - rendering stays per-frame; TF pose refresh at 15Hz is buffered by the FrameManager transformer (no data loss). Display-update cost amortized in half.
Measured (1000x750, 0.39M-tris low-poly, 30Hz request)
| config | fps |
|---|---|
| original (events every frame) | 11.1 Hz |
| + events throttle | 14.2 Hz |
| + onUpdate/2 | 16.2 Hz |
| 800x600 + all | 17.1 Hz |
| 30Hz + motion | 15.6 Hz |
| regression: 10Hz request | 10.3 Hz (at cap) |
Conclusion: llvmpipe software rasterization (render 27-31ms/frame, scales with triangle count not resolution) is the hard floor; 30 Hz requires GPU passthrough (non-llvmpipe). Docs: architecture.md 5.2, robot-state-vision-test.md 8.4.
dsh-ros2 v0.9.0
Performance: offscreen motion rendering 5.4x faster
As an embodied-agent base plugin dsh-ros2 must be invoked very quickly. The offscreen render of robot motion was the bottleneck (1.9 Hz steady frame rate for the 2.76M-triangle lite_urdf scene).
Two key optimizations (verified)
- Render-dedicated low-poly meshes - new
scripts/simplify_visual_meshes.py(open3d quadric decimation, 2.76M -> 0.39M tris): 1.9 -> 7.1 Hz, RSS 962 -> 386 MB, mesh load ~90s -> ~40s, rendered content 99.7% preserved. (Do NOT use fast_simplification - its output loses ~70% of rendered content in OGRE.) - Direct pixel read -
rviz_offscreen_nodereads the OGRE render target viacopyContentsToMemoryinstead of PNG capture + decode: capture 38ms -> 1-2ms/frame, frame 74ms -> 31ms, frame rate 7.1 -> 10.2 Hz (at the rate cap).
Net effect
- Steady motion-render frame rate 1.9 -> 10.2 Hz (5.4x)
- RSS 962 -> 386 MB (2.5x less), mesh load ~90s -> ~40s
- Pixel output identical to the PNG path (verified)
- Per-100-frame
frame-timinglog for frame-budget observability
Docs: architecture.md 5.1, robot-state-vision-test.md 8, README, CHANGELOG.
dsh-ros2 v0.8.2
Colored URDF rendering verified (lite_urdf materials). See CHANGELOG.md.
dsh-ros2 v0.8.1
Fixes
- RViz2 offscreen render: meshes piled at origin — the URDF published to RobotModel had
_link-suffixed link names that did not match the live TF frame names, so every link transform lookup failed and all meshes rendered at the fixed-frame origin. Fix: publish the robot's actual/robot_description(link names == TF frames) withfile://mesh paths. - Removed a self-built
rclcpp::spin(raw_node)thread that crashed with "node already added to an executor" (VisualizationManager already spins its internal executor inonUpdate()). - Added FrameManager diagnostics (transformer id, frame names,
transformHasProblems) to the render node log.
Changed
- Orbit camera Distance ≈ 1.5–2.0 m for an RViz-like close robot view.
robot-state-vision-analysisskill updated with JazzyDescription Source/Topic, URDF↔TF frame-name matching,file://mesh paths, camera distance and theFM framesdiagnostic.- Docs: architecture.md §4.4, robot-state-vision-test.md §6; refreshed
docs/images/robot_mesh_full.jpgwith the verified render.
dsh-ros2 v0.8.0
v0.8.0
- RViz2 离屏渲染支持机器人本体 mesh 渲染(修复 Jazzy RobotModel 属性、file:// mesh 路径、视距三个根因)
- RViz2 可视化 + 头部/手眼相机 4 路联合分析验证(状态正常)
- 实时视觉流水线(vlm_node / vlm_bridge_node / vision_bringup / rviz_offscreen)
- 37 工具 + 2 skill(ros2-diagnostics / robot-state-vision-analysis)
- 79 tests green; CI Node 22/24