feat: web app — planning viz, operate UI, looper support, nav improvements #94
Merged
feat: web app — planning viz, operate UI, looper support, nav improvements #94
Conversation
|
|
|
|
|
|
xiaolefang-dm
pushed a commit
that referenced
this pull request
Apr 21, 2026
* Update README.md. bump v0.1 * reformat
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dvorak0
reviewed
Apr 24, 2026
dvorak0
requested changes
Apr 24, 2026
- Auto-launch perception_node alongside realsense driver at backend startup - Replace /camera/camera/depth/image_rect_raw with /slam/depth - Terminate perception proc on NodeRunner.stop() Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
…at keyframe time Global path was rotating with the robot because T_odom_map was recomputed from live odomPose every frame. Now the backend snapshots odomPose at each mapPose update (odom_pose_at_kf) and the painter uses that frozen transform, so the path stays anchored in world frame between keyframes. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
…xact T_odom_map Replace approximate yaw-diff conversion in Dart with full 3D rotation (R_kf @ R_mp.T) computed from quaternions in node_manager.py, so the frontend can draw global_path directly in odom frame without any coordinate conversion logic. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
When navigation is active (global path non-empty), the operate tab now auto-switches to a full SLAM-map view that uses MapOverlayPainter to draw the path in the correct map frame — eliminating the rotation artifact caused by mixing map-frame paths with the odom-frame local canvas. The local planning view still shows obstacles/ESDF/trajectory but no longer draws the global path. ESDF colormap is inverted (BGR channel reversal) so near-obstacle regions appear red and safe regions appear blue, matching intuitive danger semantics. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
…cal plan right When the robot is localized and a global path is active, the map section switches to a side-by-side layout: the SLAM map with global path on the left (MapOverlayPainter in map frame) and the local obstacle/ESDF/trajectory view on the right. The Global Path layer toggle controls whether the split view is shown. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
Replace the previous approximated pose-based transform with a tf2_ros Buffer/TransformListener that looks up the live 'world'→'map' transform broadcast by map_node. The backend transforms each path point at snapshot time so the frontend receives odom-frame coordinates directly. Front-end reverts to single local planning canvas (no split screen); global path is drawn by LocalPlanningPainter in odom frame without rotation. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
Red circular STOP button between Sit/Stand controls. On press: sends zero velocity via teleop WS and calls /nav/cancel to halt navigation immediately. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
call_soon_threadsafe(queue.put_nowait, item) causes unhandled QueueFull exceptions in the event loop because the raise happens outside the try/except in the ROS spin thread. Wrap put in a closure that evicts the oldest item when full, keeping only the latest pose/frame. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
…in_id
- Revert tinynav/core/{build_map_node,map_node,math_utils,planning_node}.py to main
- Remove self.ros_domain_id = '0' from Ros2NodeManager; _spawn now inherits
ROS_DOMAIN_ID from the environment (defaults to 0 in ROS 2)
Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
- Add _launch_proc() to unify subprocess.Popen + _make_log + lf.close() (8 call sites) - Add _launch_sensor_procs() to merge duplicated sensor proc startup in _detect_and_init_sensor and _restart_sensor_procs - Add _safe_put() in ws.py to deduplicate queue drop-oldest logic (2 call sites) - Inline _finalize_bag_and_restart into a lambda (single-use wrapper) - Merge two lock acquisitions in get_planning_snapshot into one - Extract wait_and_convert() into named _on_build_map_done() method
After the revert that dropped hardcoded ros_domain_id, BackendNode no longer has that attribute. os.environ.copy() already inherits ROS_DOMAIN_ID from the environment, so the explicit assignments were redundant and caused AttributeError on /nav/nodes/enable. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
STOP button now calls POST /nav/restart which kills and relaunches map_node, planning_node, and cmd_vel_control, then resets state to idle. Previously called /nav/cancel which only worked during navigation state. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
…iltering - Updated stale path thresholds to be dynamically scaled based on observed planner period. - Introduced factors for slow and stop thresholds to improve responsiveness. - Added exponential moving average for path period to smooth out updates. - Implemented lookahead steps for better trajectory planning. - Enhanced velocity command filtering to reduce jitter from frequent planner updates.
…r improved trajectory handling - Reduced command publish rate from 20 Hz to 12 Hz to minimize jitter from planner updates. - Updated lookahead steps from 3 to 1 for more responsive trajectory planning. - Adjusted time delta calculation to align with actual path pose spacing.
…mum speed thresholds - Increased path stale slow factor from 2.5 to 3.5 for better responsiveness. - Raised maximum linear acceleration from 0.4 to 0.6 m/s² to allow for quicker movements. - Added minimum effective linear speed and linear engage threshold to ensure robot movement at low speeds. - Implemented logic to maintain a minimum forward speed when the planner requests motion and the path is fresh.
Subscribe to /control/target_pose (odom frame) from map_node and expose it in the planning snapshot. Render as an orange crosshair marker on the local planning view. Also default ESDF layer to visible. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
…ocity handling - Added a fixed reverse speed parameter to ensure consistent backward movement. - Updated velocity control logic to apply the fixed reverse speed when the requested forward speed is negative.
…speed 0.2 - Add 120×120 map picture-in-picture overlay (top-left of camera) showing occupancy map + robot arrow + global path, visible when localized - Default trajectory layer to enabled - Raise min_effective_linear_speed from 0.08 → 0.2 m/s Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
- Expose map_global_path (raw map frame) alongside global_path (odom frame) in planning snapshot; map PiP now uses mapGlobalPath for correct coords - STOP button now calls /nav/nodes/disable instead of /nav/restart, stopping nav nodes entirely rather than restarting them Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
- build_map_node: remove edges (already dropped from main) - build_map_node: restore queue size 200 to match main - unitree_control: revert to main (hardcoded enP8p1s0) - run_web_app: strip Flutter build logic, keep serve-only - run_web_app: remove UNITREE_NETWORK_INTERFACE hardcode - ros2_node_manager: reuse run_rosbag_record.sh for topic list - run_rosbag_record: add --output flag for programmatic use - app/README: fix ASCII art alignment, update Quick start
b13dc04 to
449e4e0
Compare
|
|
|
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description:
Complete Flutter web app with planning visualization, operate tab, camera preview, looper sensor support, and nav/cmd_vel improvements.
view of navigation page:

Quick View video
file_v3_00112_36d6d56e-9f4a-4686-9e78-2e1d81406ehu.mov