- Add chassis_node to pipeline table and startup instructions
- Fix laser topic from /gimbal/mode to /laser/command
- Add chassis mode switch and PID tuning sections
- Fix gimbal PID field names to match API.md (visual_*/angle_*)
- Fix gimbal baud rate to 921600 in troubleshooting
- Check only first child contour instead of iterating all siblings
- Add area threshold check on inner contour
- Require inner contour to be rectangular with no deeper nesting
- Publish binary+contour debug image to /vision/debug_image
- Require nested rectangular contour with no deeper children
- Add NaN guards after solvePnP and projectPoints to prevent crashes
- Replace hardcoded arrays with JSON string format for calibration and laser
parameters, matching scripts/calibrate/laser_pnp.py
- Apply IMAGE_SCALE to resize factor instead of hardcoded 0.5
- Add rectangle corner ordering (TL/BL/BR/TR) and PnP solving with SOLVEPNP_IPPE
- Compute laser world coordinates on Z=0 plane, normalize by RECT_L/RECT_W
as measurement values; reference values set to rectangle center (0.5, 0.5)
- Publish Float32MultiArray [measure_x, ref_x, measure_y, ref_y] on /vision/target
- Remove /vision/binary_image publisher
- Add ENABLE_CUDA toggle and CUDA detection log with pipeline breakdown
- Wrap rclpy.shutdown() in try/except across all nodes to avoid
"rcl_shutdown already called" errors when launched via ros2 launch.
- Replace web_node's server.shutdown() with server_close() to prevent
the HTTP server from hanging on SIGINT (shutdown() waits on an event
only set by serve_forever, which the timer-based approach doesn't use).
- Set rosbridge_websocket default_call_service_timeout=5.0,
call_services_in_new_thread=True, send_action_goals_in_new_thread=True
to match upcoming Jazzy defaults and silence startup warnings.
- camera_node (driver_pkg): Hikrobot MvCamera SDK image capture
- vision_node (algorithm_pkg): Otsu threshold + contour detection + target tracking
- web_node (application_pkg): HTTP server with MJPEG preview and mode switch API
- gimbal_node (gimbal_control_pkg): UART serial communication per gimbal protocol
- bringup_pkg: launch file for full pipeline
- config: nginx reverse-proxy for MJPEG streaming and API routing