From f6be625a8f88b72cae3e783a460890327400ad67 Mon Sep 17 00:00:00 2001 From: chyoo Date: Tue, 11 Aug 2026 14:23:29 +0900 Subject: [PATCH] synchronize source.. --- package.json | 2 +- resources/slam-ros-bridge/Dockerfile | 2 +- .../__pycache__/bridge.cpython-310.pyc | Bin 31130 -> 46098 bytes resources/slam-ros-bridge/bridge.py | 448 +++++++++- src/main/index.ts | 118 ++- src/preload/index.ts | 3 +- .../public/slam-viewer/assets/mk-mini.glb | Bin 3795556 -> 3778632 bytes src/renderer/public/slam-viewer/index.html | 818 +++++++++++++++--- src/renderer/src/App.tsx | 181 ++-- src/renderer/src/env.d.ts | 3 +- .../workspace/WorkspaceSourceControlView.tsx | 2 +- .../workspace/WorldMapSelectorModal.tsx | 16 +- .../features/workspace/moduleParameters.ts | 9 +- .../src/features/workspace/useQaChat.ts | 22 +- .../features/workspace/useSourceControl.ts | 29 +- .../workspace/useWorkspaceModuleControl.ts | 74 +- .../workspace/useWorkspaceModuleList.ts | 12 + .../workspace/useWorkspaceVisualization.ts | 19 +- 18 files changed, 1485 insertions(+), 273 deletions(-) diff --git a/package.json b/package.json index 28b88f4..edb8617 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lms", - "version": "1.1.7", + "version": "1.1.8", "description": "Autonomy Studio LMS Electron app", "main": "./out/main/index.js", "author": { diff --git a/resources/slam-ros-bridge/Dockerfile b/resources/slam-ros-bridge/Dockerfile index cc50371..7f27bd3 100644 --- a/resources/slam-ros-bridge/Dockerfile +++ b/resources/slam-ros-bridge/Dockerfile @@ -6,7 +6,7 @@ COPY requirements.txt /app/requirements.txt COPY bridge.py /app/bridge.py RUN apt-get update && \ - apt-get install -y --no-install-recommends python3-pip ros-humble-nav2-msgs && \ + apt-get install -y --no-install-recommends python3-pip ros-humble-nav2-msgs ros-humble-rtabmap-msgs ros-humble-rtabmap-util && \ pip3 install --no-cache-dir --retries 5 --timeout 180 -r /app/requirements.txt && \ rm -rf /var/lib/apt/lists/* diff --git a/resources/slam-ros-bridge/__pycache__/bridge.cpython-310.pyc b/resources/slam-ros-bridge/__pycache__/bridge.cpython-310.pyc index 21bc8ed36525771d914279fcec18716368a6ed94..01b985af8273ff8fad6d59113b7a70f7557deca9 100644 GIT binary patch literal 46098 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 rKYn*&hT1t83+Cipj|qi7=bjc9$2 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 delta 16214 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 N+?wPbctd~d{{yVKGtB@1 diff --git a/resources/slam-ros-bridge/bridge.py b/resources/slam-ros-bridge/bridge.py index 05cdb2e..6d4a329 100644 --- a/resources/slam-ros-bridge/bridge.py +++ b/resources/slam-ros-bridge/bridge.py @@ -9,6 +9,8 @@ import os import shutil import sqlite3 import struct +import subprocess +import tempfile import threading import time import traceback @@ -17,7 +19,7 @@ from pathlib import Path from typing import Optional import rclpy -from fastapi import FastAPI, HTTPException, WebSocket, WebSocketDisconnect +from fastapi import FastAPI, HTTPException, Response, WebSocket, WebSocketDisconnect from fastapi.middleware.cors import CORSMiddleware from geometry_msgs.msg import PoseStamped, PoseWithCovarianceStamped, Twist from action_msgs.msg import GoalStatus @@ -25,20 +27,21 @@ from nav_msgs.msg import OccupancyGrid, Odometry, Path as NavPath from nav2_msgs.action import NavigateToPose from pydantic import BaseModel from rclpy.action import ActionClient -from rclpy.duration import Duration from rclpy.executors import MultiThreadedExecutor from rclpy.node import Node from rclpy.parameter import Parameter from rclpy.qos import DurabilityPolicy, QoSProfile, ReliabilityPolicy, qos_profile_sensor_data from rclpy.time import Time -from sensor_msgs.msg import JointState, LaserScan, PointCloud2 -from std_msgs.msg import Float64 +from sensor_msgs.msg import CompressedImage, JointState, LaserScan, PointCloud2 +from std_msgs.msg import Float64, String +from std_srvs.srv import Empty from tf2_msgs.msg import TFMessage import uvicorn logging.basicConfig(level=logging.INFO) _POINT_CLOUD_LIMIT = max(1_000, int(os.environ.get("POINT_CLOUD_LIMIT", "50000"))) +_CAMERA_FRAME_MAX_AGE_SECONDS = 3.0 def yaw_from_quaternion(q) -> float: @@ -159,6 +162,8 @@ class SlamNode(Node): self.amcl_pose_topic = os.environ.get("AMCL_POSE_TOPIC", "/amcl_pose") self.point_cloud_topic = os.environ.get("POINT_CLOUD_TOPIC", "/cloud_map") self.fallback_point_cloud_topic = os.environ.get("FALLBACK_POINT_CLOUD_TOPIC", "/lidar_filtered") + self.color_point_cloud_topic = os.environ.get("COLOR_POINT_CLOUD_TOPIC", "/camera_test/colored_points") + self.camera_image_topic = os.environ.get("CAMERA_IMAGE_TOPIC", "/camera_test/image_jpeg") self.icp_odom_topic = os.environ.get("ICP_ODOM_TOPIC", "/icp_odom") self.cmd_vel_topic = os.environ.get("CMD_VEL_TOPIC", "/cmd_vel") self.map_topic = os.environ.get("MAP_TOPIC", "/map") @@ -166,8 +171,10 @@ class SlamNode(Node): self.joint_states_topic = os.environ.get("JOINT_STATES_TOPIC", "/joint_states") self.steering_topic = os.environ.get("STEERING_TOPIC", "/mkmini/steering_command") self.steering_feedback_topic = os.environ.get("STEERING_FEEDBACK_TOPIC", "/mkmini/steering_angle") + self.localization_session_topic = os.environ.get("LOCALIZATION_SESSION_TOPIC", "/localization_session_id") self.navigate_to_pose_action = os.environ.get("NAVIGATE_TO_POSE_ACTION", "/navigate_to_pose") self.read_only = os.environ.get("READ_ONLY", "false").lower() in ("1", "true", "yes") + self.saved_map_database_path = Path(os.environ.get("SAVED_MAP_DATABASE_PATH", "")) best_effort_qos = QoSProfile( depth=1, @@ -195,6 +202,8 @@ class SlamNode(Node): self._amcl_pose: Optional[PoseWithCovarianceStamped] = None self._point_cloud: Optional[PointCloud2] = None self._fallback_point_cloud: Optional[PointCloud2] = None + self._color_point_cloud: Optional[PointCloud2] = None + self._camera_image: Optional[CompressedImage] = None self._icp_odom: Optional[Odometry] = None self._map: Optional[OccupancyGrid] = None self._plan: Optional[NavPath] = None @@ -207,6 +216,8 @@ class SlamNode(Node): self._amcl_pose_count = 0 self._point_cloud_count = 0 self._fallback_point_cloud_count = 0 + self._color_point_cloud_count = 0 + self._camera_image_count = 0 self._icp_odom_count = 0 self._map_count = 0 self._tf_count = 0 @@ -215,6 +226,8 @@ class SlamNode(Node): self._last_amcl_pose_wall_time = None self._last_point_cloud_wall_time = None self._last_fallback_point_cloud_wall_time = None + self._last_color_point_cloud_wall_time = None + self._last_camera_image_wall_time = None self._last_icp_odom_wall_time = None self._last_map_wall_time = None self._plan_count = 0 @@ -224,17 +237,25 @@ class SlamNode(Node): self._navigation = {"status": "idle", "goal_id": None} self._active_goal_handle = None self._requested_initial_pose: Optional[dict] = None + self._initial_pose_state_path = Path( + os.environ.get("INITIAL_POSE_STATE_PATH", "/workspace/.nav2-initial-pose-state.json") + ) + self._initial_pose_set, self._initial_pose_session_id = self._load_initial_pose_state() + self._localization_session_id: Optional[str] = None self._lock = threading.Lock() + self._saved_map_point_cloud = self._load_saved_map_point_cloud() self.create_subscription(Odometry, self.odom_topic, self._on_odom, reliable_qos) self.create_subscription(Odometry, self.odom_topic, self._on_odom, best_effort_qos) self.create_subscription(LaserScan, self.scan_topic, self._on_scan, qos_profile_sensor_data) - self.create_subscription(LaserScan, self.scan_topic, self._on_scan, reliable_qos) self.create_subscription(PoseWithCovarianceStamped, self.amcl_pose_topic, self._on_amcl_pose, reliable_qos) self.create_subscription(PoseWithCovarianceStamped, self.amcl_pose_topic, self._on_amcl_pose, best_effort_qos) self.create_subscription(PointCloud2, self.point_cloud_topic, self._on_point_cloud, map_qos) if self.fallback_point_cloud_topic != self.point_cloud_topic: self.create_subscription(PointCloud2, self.fallback_point_cloud_topic, self._on_fallback_point_cloud, qos_profile_sensor_data) + if self.color_point_cloud_topic not in (self.point_cloud_topic, self.fallback_point_cloud_topic): + self.create_subscription(PointCloud2, self.color_point_cloud_topic, self._on_color_point_cloud, qos_profile_sensor_data) + self.create_subscription(CompressedImage, self.camera_image_topic, self._on_camera_image, qos_profile_sensor_data) self.create_subscription(Odometry, self.icp_odom_topic, self._on_icp_odom, best_effort_qos) self.create_subscription(Odometry, self.icp_odom_topic, self._on_icp_odom, reliable_qos) self.create_subscription(OccupancyGrid, self.map_topic, self._on_map, map_qos) @@ -242,37 +263,159 @@ class SlamNode(Node): self.create_subscription(NavPath, self.plan_topic, self._on_plan, reliable_qos) self.create_subscription(JointState, self.joint_states_topic, self._on_joint_states, reliable_qos) self.create_subscription(Float64, self.steering_feedback_topic, self._on_steering_feedback, reliable_qos) + self.create_subscription(String, self.localization_session_topic, self._on_localization_session, map_qos) self.create_subscription(TFMessage, "/tf", self._on_tf, qos_profile_sensor_data) self.create_subscription(TFMessage, "/tf_static", self._on_tf, tf_static_qos) self._cmd_vel_pub = self.create_publisher(Twist, self.cmd_vel_topic, 10) self._steering_pub = self.create_publisher(Float64, self.steering_topic, 10) self._initial_pose_pub = self.create_publisher(PoseWithCovarianceStamped, "/initialpose", 10) self._navigate_to_pose_client = ActionClient(self, NavigateToPose, self.navigate_to_pose_action) + self._rtabmap_backup_client = self.create_client(Empty, "/rtabmap/backup") self.get_logger().info( - f"SLAM bridge started: odom={self.odom_topic}, icp_odom={self.icp_odom_topic}, scan={self.scan_topic}, point_cloud={self.point_cloud_topic}, fallback_point_cloud={self.fallback_point_cloud_topic}, map={self.map_topic}, read_only={self.read_only}" + f"SLAM bridge started: odom={self.odom_topic}, icp_odom={self.icp_odom_topic}, scan={self.scan_topic}, point_cloud={self.point_cloud_topic}, fallback_point_cloud={self.fallback_point_cloud_topic}, color_point_cloud={self.color_point_cloud_topic}, camera_image={self.camera_image_topic}, map={self.map_topic}, read_only={self.read_only}" ) + def _load_saved_map_point_cloud(self) -> Optional[dict]: + """Create a stable navigation-map cloud from the selected RTAB-Map DB.""" + if not self.saved_map_database_path.is_file(): + return None + + try: + with tempfile.TemporaryDirectory(prefix="slam-map-cloud-") as output_dir: + output_name = "saved-map" + subprocess.run( + [ + "rtabmap-export", + "--cloud", + "--scan", + "--voxel", + "0.01", + "--output", + output_name, + "--output_dir", + output_dir, + str(self.saved_map_database_path), + ], + check=True, + stdout=subprocess.DEVNULL, + stderr=subprocess.PIPE, + text=True, + timeout=90, + ) + points = self._read_exported_ply_points( + Path(output_dir) / f"{output_name}_cloud.ply", + _POINT_CLOUD_LIMIT, + ) + except (OSError, subprocess.SubprocessError, ValueError) as error: + self.get_logger().warning(f"Saved 3D map export failed: {error}") + return None + + if not points: + self.get_logger().warning("Saved 3D map export did not contain any points.") + return None + self.get_logger().info(f"Loaded saved 3D map point cloud: {len(points)} points") + return { + "frame_id": "map", + "points": points, + "transform": {"x": 0.0, "y": 0.0, "z": 0.0, "yaw": 0.0}, + "saved_map": True, + } + + @staticmethod + def _read_exported_ply_points(path: Path, limit: int) -> list[list[float]]: + with path.open("rb") as source: + header = bytearray() + while not header.endswith(b"end_header\n"): + chunk = source.read(1) + if not chunk or len(header) > 16_384: + raise ValueError("Invalid exported PLY header") + header.extend(chunk) + lines = header.decode("ascii", errors="strict").splitlines() + if "format binary_little_endian 1.0" not in lines: + raise ValueError("Unsupported exported PLY format") + vertex_line = next((line for line in lines if line.startswith("element vertex ")), None) + if vertex_line is None: + raise ValueError("Exported PLY does not have vertices") + vertex_count = int(vertex_line.rsplit(" ", 1)[1]) + if vertex_count <= 0: + return [] + + # rtabmap-export writes x/y/z followed by five float fields. + data = source.read(vertex_count * 32) + if len(data) < vertex_count * 32: + raise ValueError("Exported PLY was truncated") + stride = max(1, (vertex_count + max(1, limit) - 1) // max(1, limit)) + return [ + list(struct.unpack_from("<3f", data, index * 32)) + for index in range(0, vertex_count, stride) + ] + + def _load_initial_pose_state(self) -> tuple[bool, Optional[str]]: + try: + payload = json.loads(self._initial_pose_state_path.read_text(encoding="utf-8")) + session_id = payload.get("localization_session_id") + return ( + payload.get("initial_pose_set") is True, + session_id.strip() if isinstance(session_id, str) and session_id.strip() else None, + ) + except (OSError, ValueError, TypeError): + return False, None + + def _save_initial_pose_state(self) -> None: + try: + self._initial_pose_state_path.parent.mkdir(parents=True, exist_ok=True) + temporary_path = self._initial_pose_state_path.with_suffix(".tmp") + temporary_path.write_text(json.dumps({ + "initial_pose_set": self._initial_pose_set, + "localization_session_id": self._initial_pose_session_id, + }), encoding="utf-8") + temporary_path.replace(self._initial_pose_state_path) + except OSError as error: + self.get_logger().warning(f"Failed to persist initial pose state: {error}") + + def _on_localization_session(self, msg: String): + session_id = msg.data.strip() + if not session_id: + return + + should_persist = False + with self._lock: + if self._localization_session_id == session_id: + return + + self._localization_session_id = session_id + if self._initial_pose_set and self._initial_pose_session_id == "__pending__": + self._initial_pose_session_id = session_id + should_persist = True + elif self._initial_pose_session_id != session_id: + # A localization module restart starts a new estimation session. + # Never reuse the previous session's initial pose in it. + self._initial_pose_set = False + self._initial_pose_session_id = None + should_persist = True + + if should_persist: + self._save_initial_pose_state() + self.get_logger().info("Localization session changed; initial pose state was reset.") + def _on_odom(self, msg: Odometry): with self._lock: self._odom = msg self._odom_count += 1 self._last_odom_wall_time = time.time() - def publish_initial_pose(self, x: float, y: float, yaw: float = 0.0, frame_id: str = "map") -> None: - # AMCL transforms the initial pose at the message timestamp. On a real - # platform the bridge clock can be a few milliseconds ahead of the - # latest odom/TF sample, which makes AMCL reject the pose as a future - # extrapolation. Anchor it to the latest received odometry instead. + def publish_initial_pose(self, x: float, y: float, yaw: float = 0.0, frame_id: str = "map") -> dict: + """Provide a map-frame seed without overwriting live ICP odometry.""" with self._lock: - odom_stamp = self._odom.header.stamp if self._odom is not None else None + has_3d_localization = self._icp_odom is not None + + # A zero ROS timestamp means "use the latest available transform". + # The bridge and platform receive odometry through different DDS + # processes, so an odometry-derived timestamp can still be newer than + # AMCL's TF buffer. message = PoseWithCovarianceStamped() - if odom_stamp: - # The odom callback can lead the TF buffer by a few milliseconds. - # Keep a small margin so AMCL can always transform map -> odom. - message.header.stamp = (Time.from_msg(odom_stamp) - Duration(seconds=0.1)).to_msg() - else: - message.header.stamp = self.get_clock().now().to_msg() + message.header.stamp = Time().to_msg() message.header.frame_id = frame_id message.pose.pose.position.x = x message.pose.pose.position.y = y @@ -284,20 +427,33 @@ class SlamNode(Node): message.pose.covariance[0] = 0.25 message.pose.covariance[7] = 0.25 message.pose.covariance[35] = 0.0685 - with self._lock: - # Use this only until AMCL starts publishing map -> odom. It is a - # short-lived viewer fallback, not a replacement for live TF. - self._requested_initial_pose = { - "x": float(x), - "y": float(y), - "z": 0.0, - "yaw": float(yaw), - "frame_id": frame_id or "map", - "t": time.time(), - "expires_at": time.monotonic() + 2.0, - } + if not has_3d_localization: + with self._lock: + # Use this only until AMCL starts publishing map -> odom. It + # is a short-lived viewer fallback, not a replacement for TF. + self._requested_initial_pose = { + "x": float(x), + "y": float(y), + "z": 0.0, + "yaw": float(yaw), + "frame_id": frame_id or "map", + "t": time.time(), + "expires_at": time.monotonic() + 2.0, + } + # In 3D this is consumed by the localization module's local relay, + # which can call ICP odometry without crossing the DDS peer boundary. self._initial_pose_pub.publish(message) + with self._lock: + self._initial_pose_set = True + self._initial_pose_session_id = self._localization_session_id or "__pending__" + self._save_initial_pose_state() + return { + "mode": "rtabmap-3d" if has_3d_localization else "amcl-2d", + "refining": has_3d_localization, + } + + def save_map(self, name: Optional[str] = None) -> dict: with self._lock: grid = self._map @@ -369,6 +525,10 @@ class SlamNode(Node): database_path = None database_source = Path(os.environ.get("RTABMAP_DATABASE_PATH", "")) if os.environ.get("RTABMAP_MAP_SAVE_ENABLED", "").lower() == "true" and database_source.is_file(): + # RTAB-Map keeps the optimized pose graph in memory until its + # backup service flushes it. Copying SQLite directly here leaves a + # usable PGM but a DB that cannot localize on the saved map. + self._backup_rtabmap_database() database_snapshot = maps_dir / f"{safe_name}.db" source_connection = None destination_connection = None @@ -386,6 +546,11 @@ class SlamNode(Node): destination_connection.close() if source_connection is not None: source_connection.close() + # A saved map must start unlocalized. RTAB-Map stores the last + # localization pose beside the optimized graph; retaining it + # makes a later localization session place the vehicle before the + # learner supplies the first pose. + self._clear_database_last_localization(database_snapshot) database_path = str(database_snapshot) return { @@ -399,6 +564,28 @@ class SlamNode(Node): "previewPgm": base64.b64encode(preview_pgm).decode("ascii"), } + def _backup_rtabmap_database(self, timeout_seconds: float = 30.0) -> None: + if not self._rtabmap_backup_client.wait_for_service(timeout_sec=5.0): + raise RuntimeError("3D SLAM DB 저장 서비스를 찾지 못했습니다. RTAB-Map 모듈이 실행 중인지 확인하세요.") + + future = self._rtabmap_backup_client.call_async(Empty.Request()) + deadline = time.monotonic() + timeout_seconds + while not future.done() and time.monotonic() < deadline: + time.sleep(0.05) + + if not future.done(): + raise RuntimeError("3D SLAM DB 저장 시간이 초과되었습니다.") + if future.exception() is not None: + raise RuntimeError(f"3D SLAM DB 저장에 실패했습니다: {future.exception()}") + + @staticmethod + def _clear_database_last_localization(database_path: Path) -> None: + try: + with sqlite3.connect(str(database_path)) as connection: + connection.execute("UPDATE Admin SET opt_last_localization = NULL") + except sqlite3.Error as error: + raise RuntimeError(f"저장한 3D SLAM DB를 정리하지 못했습니다: {error}") from error + def _on_scan(self, msg: LaserScan): with self._lock: self._scan = msg @@ -423,6 +610,18 @@ class SlamNode(Node): self._fallback_point_cloud_count += 1 self._last_fallback_point_cloud_wall_time = time.time() + def _on_color_point_cloud(self, msg: PointCloud2): + with self._lock: + self._color_point_cloud = msg + self._color_point_cloud_count += 1 + self._last_color_point_cloud_wall_time = time.time() + + def _on_camera_image(self, msg: CompressedImage): + with self._lock: + self._camera_image = msg + self._camera_image_count += 1 + self._last_camera_image_wall_time = time.time() + def _active_point_cloud(self) -> Optional[PointCloud2]: with self._lock: primary = self._point_cloud @@ -478,6 +677,8 @@ class SlamNode(Node): amcl_pose_last = self._last_amcl_pose_wall_time point_cloud_last = self._last_point_cloud_wall_time fallback_point_cloud_last = self._last_fallback_point_cloud_wall_time + color_point_cloud_last = self._last_color_point_cloud_wall_time + camera_image_last = self._last_camera_image_wall_time map_count = self._map_count plan_count = self._plan_count @@ -500,7 +701,24 @@ class SlamNode(Node): "amcl_pose": {"name": self.amcl_pose_topic, "available": received_recently(amcl_pose_last)}, "point_cloud": { "name": self.point_cloud_topic, - "available": received_recently(point_cloud_last) or received_recently(fallback_point_cloud_last), + # RTAB-Map publishes the reconstructed global cloud with + # TRANSIENT_LOCAL durability. In localization it may publish + # only once after loading the database, so a received map is + # still valid even when it is older than the live-topic + # freshness window used for sensors. + "available": self._saved_map_point_cloud is not None or point_cloud_last is not None, + }, + "sensor_point_cloud": { + "name": self.fallback_point_cloud_topic, + "available": received_recently(fallback_point_cloud_last), + }, + "color_point_cloud": { + "name": self.color_point_cloud_topic, + "available": received_recently(color_point_cloud_last), + }, + "camera_image": { + "name": self.camera_image_topic, + "available": received_recently(camera_image_last), }, "plan": {"name": self.plan_topic, "available": plan_available}, "cmd_vel": {"name": self.cmd_vel_topic, "available": cmd_vel_available}, @@ -725,8 +943,14 @@ class SlamNode(Node): plan = self._plan amcl_pose = self._amcl_pose requested_initial_pose = dict(self._requested_initial_pose) if self._requested_initial_pose else None + initial_pose_set = self._initial_pose_set + localization_session_id = self._localization_session_id + initial_pose_session_id = self._initial_pose_session_id joint_positions = dict(self._joint_positions) steering_feedback = self._steering_feedback + fallback_point_cloud = self._fallback_point_cloud + color_point_cloud = self._color_point_cloud + camera_image = self._camera_image tf_snapshot = dict(self._tf) navigation = dict(self._navigation) effective_map = self._effective_map(grid, scan, odom) @@ -897,15 +1121,14 @@ class SlamNode(Node): "yaw": euler["yaw"], "t": icp_odom.header.stamp.sec + icp_odom.header.stamp.nanosec * 1e-9, } - cloud_frame = point_cloud.header.frame_id if point_cloud is not None else "" - map_to_icp_odom = tf_snapshot.get((cloud_frame, icp_odom.header.frame_id)) if cloud_frame else None + map_to_icp_odom = resolve_2d_transform(tf_snapshot, "map", icp_odom.header.frame_id) if map_to_icp_odom is not None: - # RTAB-Map publishes /cloud_map in map, while ICP odometry is - # expressed in icp_odom. Render both in the cloud frame. + # ICP is local odometry. RTAB-Map localization publishes the + # map -> icp_odom correction needed to render it on the saved map. pose_3d = { **pose_3d, **compose_2d(map_to_icp_odom, pose_3d), - "frame_id": cloud_frame, + "frame_id": "map", "source_frame_id": icp_odom.header.frame_id, } @@ -943,12 +1166,38 @@ class SlamNode(Node): "t": point_cloud.header.stamp.sec + point_cloud.header.stamp.nanosec * 1e-9, } + sensor_point_cloud_payload = None + if fallback_point_cloud is not None: + sensor_point_cloud_payload = { + "frame_id": fallback_point_cloud.header.frame_id, + "count": fallback_point_cloud.width * fallback_point_cloud.height, + "t": fallback_point_cloud.header.stamp.sec + fallback_point_cloud.header.stamp.nanosec * 1e-9, + } + + color_point_cloud_payload = None + if color_point_cloud is not None: + color_point_cloud_payload = { + "frame_id": color_point_cloud.header.frame_id, + "count": color_point_cloud.width * color_point_cloud.height, + "t": color_point_cloud.header.stamp.sec + color_point_cloud.header.stamp.nanosec * 1e-9, + } + + camera_image_payload = None + if camera_image is not None: + camera_image_payload = { + "frame_id": camera_image.header.frame_id, + "t": camera_image.header.stamp.sec + camera_image.header.stamp.nanosec * 1e-9, + } + return { "ok": True, "topics": { "odom": self.odom_topic, "scan": self.scan_topic, "point_cloud": self.point_cloud_topic, + "sensor_point_cloud": self.fallback_point_cloud_topic, + "color_point_cloud": self.color_point_cloud_topic, + "camera_image": self.camera_image_topic, "icp_odom": self.icp_odom_topic, "map": self.map_topic, "cmd_vel": self.cmd_vel_topic, @@ -962,11 +1211,17 @@ class SlamNode(Node): "vehicle": vehicle, "scan": scan_payload, "point_cloud": point_cloud_payload, + "sensor_point_cloud": sensor_point_cloud_payload, + "color_point_cloud": color_point_cloud_payload, + "camera_image": camera_image_payload, "map": map_payload, "tf": { "map_to_odom": resolve_2d_transform(tf_snapshot, "map", "odom"), }, "navigation": navigation, + "initial_pose_set": initial_pose_set, + "localization_session_id": localization_session_id, + "initial_pose_session_id": initial_pose_session_id, "topic_status": self.topic_status(), "plan": { "frame_id": plan.header.frame_id, @@ -983,7 +1238,57 @@ class SlamNode(Node): } def point_cloud_payload(self, limit: int = _POINT_CLOUD_LIMIT) -> Optional[dict]: - cloud = self._active_point_cloud() + with self._lock: + saved_map_point_cloud = self._saved_map_point_cloud + # A saved RTAB-Map map may be published in the local ICP frame + # during navigation, while a live SLAM map is normally in `map`. + # Preserve the source frame here so the viewer can place either + # cloud in the common map scene. + cloud = self._point_cloud or self._fallback_point_cloud + tf_snapshot = dict(self._tf) + if saved_map_point_cloud is not None: + return saved_map_point_cloud + payload = self._serialize_point_cloud(cloud, limit) + if payload is None: + return None + payload["transform"] = resolve_2d_transform(tf_snapshot, "map", payload["frame_id"]) + return payload + + def sensor_point_cloud_payload(self, limit: int = 10_000) -> Optional[dict]: + with self._lock: + cloud = self._fallback_point_cloud + tf_snapshot = dict(self._tf) + received_at = self._last_fallback_point_cloud_wall_time + payload = self._serialize_point_cloud(cloud, limit) + if payload is None: + return None + payload["transform"] = resolve_2d_transform(tf_snapshot, "map", payload["frame_id"]) + payload["received_at"] = received_at + return payload + + def color_point_cloud_payload(self, limit: int = 10_000) -> Optional[dict]: + with self._lock: + cloud = self._color_point_cloud + tf_snapshot = dict(self._tf) + received_at = self._last_color_point_cloud_wall_time + payload = self._serialize_point_cloud(cloud, limit, include_colors=True) + if payload is None: + return None + payload["transform"] = resolve_2d_transform(tf_snapshot, "map", payload["frame_id"]) + payload["received_at"] = received_at + return payload + + def camera_frame_jpeg(self) -> Optional[bytes]: + with self._lock: + image = self._camera_image + received_at = self._last_camera_image_wall_time + if image is None or received_at is None or time.time() - received_at > _CAMERA_FRAME_MAX_AGE_SECONDS: + return None + if not image.data or "jpeg" not in image.format.lower(): + return None + return bytes(image.data) + + def _serialize_point_cloud(self, cloud: Optional[PointCloud2], limit: int, include_colors: bool = False) -> Optional[dict]: if cloud is None or cloud.point_step <= 0 or not cloud.data: return None @@ -998,6 +1303,9 @@ class SlamNode(Node): prefix = ">" if cloud.is_bigendian else "<" data = cloud.data points = [] + colors = [] + color_offset = offsets.get("rgb", offsets.get("rgba")) + color_field = next((field for field in cloud.fields if field.name in ("rgb", "rgba")), None) for index in range(0, total, stride): offset = index * cloud.point_step if offset + cloud.point_step > len(data): @@ -1010,12 +1318,27 @@ class SlamNode(Node): break if math.isfinite(x) and math.isfinite(y) and math.isfinite(z): points.append([x, y, z]) + if include_colors: + rgb = 0xFFFFFF + if color_offset is not None and color_field is not None: + try: + if color_field.datatype == 6: # PointField.UINT32 + rgb = struct.unpack_from(f"{prefix}I", data, offset + color_offset)[0] + elif color_field.datatype == 7: # PointField.FLOAT32 packed RGB + packed = struct.unpack_from(f"{prefix}f", data, offset + color_offset)[0] + rgb = struct.unpack(f"{prefix}I", struct.pack(f"{prefix}f", packed))[0] + except struct.error: + pass + colors.append([(rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF]) - return { + payload = { "frame_id": cloud.header.frame_id, "stamp": cloud.header.stamp.sec + cloud.header.stamp.nanosec * 1e-9, "points": points, } + if include_colors: + payload["colors"] = colors + return payload def map_binary(self) -> Optional[bytes]: with self._lock: @@ -1049,7 +1372,7 @@ class SlamNode(Node): def topic_debug(self) -> dict: topics = {} for name, types in self.get_topic_names_and_types(): - if name in (self.odom_topic, self.icp_odom_topic, self.scan_topic, self.point_cloud_topic, self.fallback_point_cloud_topic, self.map_topic, self.cmd_vel_topic): + if name in (self.odom_topic, self.icp_odom_topic, self.scan_topic, self.point_cloud_topic, self.fallback_point_cloud_topic, self.color_point_cloud_topic, self.camera_image_topic, self.map_topic, self.cmd_vel_topic): topics[name] = types return { @@ -1058,6 +1381,8 @@ class SlamNode(Node): "scan": self.scan_topic, "point_cloud": self.point_cloud_topic, "fallback_point_cloud": self.fallback_point_cloud_topic, + "color_point_cloud": self.color_point_cloud_topic, + "camera_image": self.camera_image_topic, "icp_odom": self.icp_odom_topic, "map": self.map_topic, "cmd_vel": self.cmd_vel_topic, @@ -1067,6 +1392,8 @@ class SlamNode(Node): "scan_publishers": self.count_publishers(self.scan_topic), "point_cloud_publishers": self.count_publishers(self.point_cloud_topic), "fallback_point_cloud_publishers": self.count_publishers(self.fallback_point_cloud_topic), + "color_point_cloud_publishers": self.count_publishers(self.color_point_cloud_topic), + "camera_image_publishers": self.count_publishers(self.camera_image_topic), "icp_odom_publishers": self.count_publishers(self.icp_odom_topic), "odom_publishers": self.count_publishers(self.odom_topic), "map_publishers": self.count_publishers(self.map_topic), @@ -1075,6 +1402,8 @@ class SlamNode(Node): "scan_count": self._scan_count, "point_cloud_count": self._point_cloud_count, "fallback_point_cloud_count": self._fallback_point_cloud_count, + "color_point_cloud_count": self._color_point_cloud_count, + "camera_image_count": self._camera_image_count, "icp_odom_count": self._icp_odom_count, "odom_count": self._odom_count, "map_count": self._map_count, @@ -1082,6 +1411,8 @@ class SlamNode(Node): "last_scan_wall_time": self._last_scan_wall_time, "last_point_cloud_wall_time": self._last_point_cloud_wall_time, "last_fallback_point_cloud_wall_time": self._last_fallback_point_cloud_wall_time, + "last_color_point_cloud_wall_time": self._last_color_point_cloud_wall_time, + "last_camera_image_wall_time": self._last_camera_image_wall_time, "last_icp_odom_wall_time": self._last_icp_odom_wall_time, "last_odom_wall_time": self._last_odom_wall_time, "last_map_wall_time": self._last_map_wall_time, @@ -1155,6 +1486,36 @@ def point_cloud(): return payload +@app.get("/sensor-point-cloud") +def sensor_point_cloud(): + if not slam_node: + raise HTTPException(status_code=503, detail="ROS node is not ready") + payload = slam_node.sensor_point_cloud_payload() + if payload is None: + raise HTTPException(status_code=404, detail="센서 포인트클라우드를 아직 수신하지 못했습니다.") + return payload + + +@app.get("/color-point-cloud") +def color_point_cloud(): + if not slam_node: + raise HTTPException(status_code=503, detail="ROS node is not ready") + payload = slam_node.color_point_cloud_payload() + if payload is None: + raise HTTPException(status_code=404, detail="컬러 포인트클라우드를 아직 수신하지 못했습니다.") + return payload + + +@app.get("/camera-frame") +def camera_frame(): + if not slam_node: + raise HTTPException(status_code=503, detail="ROS node is not ready") + frame = slam_node.camera_frame_jpeg() + if frame is None: + raise HTTPException(status_code=404, detail="카메라 프레임을 아직 수신하지 못했습니다.") + return Response(content=frame, media_type="image/jpeg", headers={"Cache-Control": "no-store"}) + + @app.get("/world-layout") def world_layout(): path = Path(os.environ.get("WORLD_LAYOUT_PATH", "/workspace/world-layout.json")) @@ -1172,7 +1533,7 @@ def save_map(payload: SaveMapPayload): raise HTTPException(status_code=503, detail="ROS node is not ready") try: return {"ok": True, "map": slam_node.save_map(payload.name)} - except ValueError as error: + except (ValueError, RuntimeError) as error: raise HTTPException(status_code=409, detail=str(error)) from error @@ -1239,8 +1600,11 @@ def initial_pose(payload: InitialPosePayload): raise HTTPException(status_code=503, detail="ROS node is not ready") if slam_node.read_only: raise HTTPException(status_code=403, detail="읽기 전용 3D SLAM 화면에서는 초기 위치를 설정할 수 없습니다.") - slam_node.publish_initial_pose(payload.x, payload.y, payload.yaw, payload.frame_id) - return {"ok": True} + try: + result = slam_node.publish_initial_pose(payload.x, payload.y, payload.yaw, payload.frame_id) + except RuntimeError as error: + raise HTTPException(status_code=409, detail=str(error)) from error + return {"ok": True, **result} @app.websocket("/ws/state") diff --git a/src/main/index.ts b/src/main/index.ts index ee67962..dfb7cd1 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -352,7 +352,11 @@ async function syncWorkspaceSavedMapArtifacts( } await Promise.all(artifacts.map(async (artifact) => { const normalized = validateSavedMapDownload(artifact) - await downloadArtifact(normalized.url, resolve(mapsDirectory, normalized.fileName)) + const targetPath = resolve(mapsDirectory, normalized.fileName) + // SLAM containers can leave an artifact owned by root. Removing it first + // lets the download recreate the file with the desktop user's ownership. + await rm(targetPath, { force: true }) + await downloadArtifact(normalized.url, targetPath) })) return { ok: true } } @@ -1335,6 +1339,45 @@ async function readRemoteSavedMapArtifacts( })) } +async function copyRemoteActiveRtabmapDatabaseToLocal( + targetInput: RemoteWorkspaceTarget, + localWorkspaceRoot: string | null | undefined, + destinationPath: string, +): Promise<{ databasePath: string }> { + const target = normalizeRemoteTarget(targetInput) + const destinationFileName = savedMapArtifactFileName('database', destinationPath) + const sourcePath = `${target.workspaceRoot}/maps/rtabmap-active.db` + const snapshotScript = [ + 'import sqlite3, sys', + 'source, destination = sys.argv[1:3]', + 'source_db = sqlite3.connect(f"file:{source}?mode=ro", uri=True)', + 'destination_db = sqlite3.connect(destination)', + 'source_db.backup(destination_db)', + 'destination_db.close()', + 'source_db.close()', + ].join('; ') + const remoteCommand = [ + 'set -e', + `SOURCE=${quoteShellSingle(sourcePath)}`, + 'test -f "$SOURCE" || { echo "3D SLAM DB를 찾을 수 없습니다: $SOURCE" >&2; exit 1; }', + 'SNAPSHOT=$(mktemp)', + `python3 -c ${quoteShellSingle(snapshotScript)} "$SOURCE" "$SNAPSHOT"`, + 'base64 -w0 "$SNAPSHOT"', + 'rm -f "$SNAPSHOT"', + ].join('\n') + const base64 = (await runSshOutput(target, remoteCommand, 120_000)).trim() + if (!base64) throw new Error('3D SLAM DB 스냅샷을 읽지 못했습니다.') + + await syncWorkspaceSavedMapArtifacts(localWorkspaceRoot, []) + const root = expandUserPath(localWorkspaceRoot) + if (!root) throw new Error('로컬 워크스페이스 경로가 설정되어 있지 않습니다.') + const mapsDirectory = resolve(root, 'maps') + const destination = resolve(mapsDirectory, destinationFileName) + if (!destination.startsWith(`${mapsDirectory}/`)) throw new Error('저장된 3D 맵 경로가 올바르지 않습니다.') + await writeFile(destination, Buffer.from(base64, 'base64')) + return { databasePath: `/workspace/maps/${destinationFileName}` } +} + async function syncRemoteSavedMapArtifacts( targetInput: RemoteWorkspaceTarget, artifacts: SavedMapArtifactDownload[], @@ -1347,7 +1390,13 @@ async function syncRemoteSavedMapArtifacts( `ROOT=${quoteShellSingle(target.workspaceRoot)}`, `MAPS_DIRECTORY=${quoteShellSingle(mapsDirectory)}`, 'if [ ! -d "$MAPS_DIRECTORY" ] || [ ! -w "$MAPS_DIRECTORY" ]; then', - ' IMAGE="$(docker image inspect future-nav2:humble-jetson_orin --format {{.Id}} >/dev/null 2>&1 && printf future-nav2:humble-jetson_orin || docker image inspect future-nav2:humble --format {{.Id}} >/dev/null 2>&1 && printf future-nav2:humble || true)"', + ' if docker image inspect future-nav2:humble-jetson_orin >/dev/null 2>&1; then', + ' IMAGE="future-nav2:humble-jetson_orin"', + ' elif docker image inspect future-nav2:humble >/dev/null 2>&1; then', + ' IMAGE="future-nav2:humble"', + ' else', + ' IMAGE=""', + ' fi', ' if [ -z "$IMAGE" ]; then echo "저장된 맵 디렉터리에 쓸 권한이 없고 권한 복구용 NAV2 이미지를 찾을 수 없습니다." >&2; exit 1; fi', ' docker run --rm --user 0:0 -v "$ROOT:/workspace" --entrypoint /bin/sh "$IMAGE" -lc "mkdir -p /workspace/maps && chown -R $(id -u):$(id -g) /workspace/maps"', 'fi', @@ -1460,7 +1509,7 @@ async function startRemoteVisualizationBridge( `-e ROBOT_STACK=${quoteShellSingle(stack === 'autoware' ? 'autoware' : 'nav2')}`, '-e ODOM_TOPIC=/odom -e SCAN_TOPIC=/scan -e MAP_TOPIC=/map -e CMD_VEL_TOPIC=/cmd_vel -e NAVIGATE_TO_POSE_ACTION=/navigate_to_pose', ...(stack === 'slam3d' - ? ['-e POINT_CLOUD_TOPIC=/cloud_map -e FALLBACK_POINT_CLOUD_TOPIC=/lidar_filtered -e ICP_ODOM_TOPIC=/icp_odom -e POINT_CLOUD_LIMIT=50000 -e READ_ONLY=true -e RTABMAP_MAP_SAVE_ENABLED=true'] + ? ['-e POINT_CLOUD_TOPIC=/cloud_map -e FALLBACK_POINT_CLOUD_TOPIC=/lidar_filtered -e ICP_ODOM_TOPIC=/icp_odom -e POINT_CLOUD_LIMIT=50000 -e RTABMAP_MAP_SAVE_ENABLED=true'] : []), bridgeEnvArgs, '-e WORLD_LAYOUT_PATH=/workspace/world-layout.json -e SAVED_MAPS_PATH=/workspace/maps -e RTABMAP_DATABASE_PATH=/workspace/maps/rtabmap-active.db', @@ -2450,7 +2499,7 @@ function bridgeContainerCommand(stack: VisualizationStack): string { return [ 'source /opt/ros/humble/setup.bash', setupWorkspace, - `python3 -c "import fastapi, uvicorn, websockets" || python3 -m pip install --no-cache-dir -r ${requirementPath}`, + `(python3 -c "import fastapi, uvicorn, websockets" || python3 -m pip install --no-cache-dir -r ${requirementPath})`, `python3 ${bridgePath}` ].filter(Boolean).join(' && ') } @@ -2739,6 +2788,7 @@ async function startVisualizationBridge( rosDomainId?: string | null, environmentProfile?: EnvironmentProfileConfig | null, rosNetwork?: RosNetworkConfig | null, + savedMapDatabasePath?: string | null, ): Promise { const stack = normalizeVisualizationStack(environmentProfile?.type?.toLowerCase() ?? stackInput) const resolvedProfile = withRuntimeProfileDefaults(environmentProfile, stack) @@ -2840,6 +2890,10 @@ async function startVisualizationBridge( '-e', 'RTABMAP_DATABASE_PATH=/workspace/maps/rtabmap-active.db', ) if (stack === 'slam3d') args.push('-e', 'RTABMAP_MAP_SAVE_ENABLED=true') + const savedMapFileName = savedMapDatabasePath ? safeSavedMapFileName(basename(savedMapDatabasePath)) : null + if (savedMapFileName?.endsWith('.db') && existsSync(resolve(layoutWorkspaceRoot, 'maps', savedMapFileName))) { + args.push('-e', `SAVED_MAP_DATABASE_PATH=/workspace/maps/${savedMapFileName}`) + } } const fastDdsConfigPath = await prepareLocalRosNetworkConfig(rosNetwork, requestedRosDomainId) if (fastDdsConfigPath && existsSync(fastDdsConfigPath)) { @@ -3101,8 +3155,15 @@ async function installRemoteWorkspaceModule( ' expected = (item.get("checksumSha256") or "").strip().lower()', ' if expected:', ' import hashlib', - ' with open(path, "rb") as fp: actual = hashlib.sha256(fp.read()).hexdigest().lower()', - ' if actual != expected: raise SystemExit(f"artifact checksum mismatch: {name}")', + ' def checksum(file_path):', + ' with open(file_path, "rb") as fp: return hashlib.sha256(fp.read()).hexdigest().lower()', + ' actual = checksum(path)', + ' if actual != expected:', + ' # Stable artifact URLs may have a newer object than the local cache.', + ' os.unlink(path)', + ' subprocess.run(["curl", "-fL", url, "-o", path], check=True)', + ' actual = checksum(path)', + ' if actual != expected: raise SystemExit(f"artifact checksum mismatch: {name}")', ' entries = subprocess.check_output(["tar", *tar_args(path, "list"), path], text=True)', ' for entry in entries.splitlines():', ' entry = entry.strip()', @@ -3512,13 +3573,13 @@ function buildNav2DockerRunScript(): string { 'esac', 'fi', '', - 'if [[ "$MODULE_FOLDER" == *lms-nav2-gazebo-slam3d* ]]; then', + 'if [[ "$MODULE_FOLDER" == *lms-nav2-gazebo-slam3d* || "$MODULE_FOLDER" == *lms-nav2-gazebo-localization* ]]; then', ' mkdir -p "$MODULE_ROOT/maps"', ' has_database_path=false', ' for arg in "$@"; do', ' if [[ "$arg" == database_path:=* ]]; then has_database_path=true; break; fi', ' done', - ' if [ "$has_database_path" = false ]; then', + ' if [[ "$MODULE_FOLDER" == *lms-nav2-gazebo-slam3d* && "$has_database_path" = false ]] || [[ "$MODULE_FOLDER" == *lms-nav2-gazebo-localization* && "$has_database_path" = false ]]; then', ' set -- "database_path:=/modules/maps/rtabmap-active.db" "$@"', ' fi', 'fi', @@ -3621,11 +3682,19 @@ function buildNav2DockerBuildScript(): string { ' set -e', ' source /opt/ros/humble/setup.bash', ' mapfile -t paths < <(colcon list --base-paths src --paths-only)', - " rosdep install --from-paths \"${paths[@]}\" --ignore-src \\", + ' ROSDEP_SKIP_ARGS=()', + ' if ! apt-cache show ros-humble-gazebo-ros >/dev/null 2>&1; then', + ' ROSDEP_SKIP_ARGS=(--skip-keys gazebo_ros)', + ' fi', + " rosdep install --from-paths \"${paths[@]}\" --ignore-src \"${ROSDEP_SKIP_ARGS[@]}\" \\", " --dependency-types buildtool --dependency-types build \\", ' --dependency-types build_export --dependency-types exec -r -y', + ' BUILD_TARGETS=("$2")', + ' if [[ "$1" == *lms-nav2-gazebo-slam* && "$1" != *lms-nav2-gazebo-slam3d* ]]; then', + ' BUILD_TARGETS=(slam_pkg slam2d_pkg slam3d_pkg)', + ' fi', " colcon --log-base log build --base-paths src --build-base build --install-base install \\", - ' --executor sequential --cmake-args -DBUILD_TESTING=OFF --packages-up-to "$2"', + ' --executor sequential --cmake-args -DBUILD_TESTING=OFF --packages-up-to "${BUILD_TARGETS[@]}"', "' bash \"$MODULE_FOLDER\" \"$TARGET\"", '' ].join('\n') @@ -3785,6 +3854,22 @@ async function findRunningNav2SimulatorContainer(): Promise { } async function findNav2SimulatorRobotModel(containerName: string): Promise { + // Query Gazebo directly first. The ROS GetModelList service can be slow or + // unavailable while DDS participants are still discovering each other, even + // though the simulator itself is already able to accept a pose update. + const knownModels = ['mkmini_gazebo', 'turtlebot3_burger_3d_lidar', 'turtlebot3_burger'] + for (const modelName of knownModels) { + const pose = await runCommandOutput( + 'docker', + ['exec', containerName, 'gz', 'model', '-m', modelName, '-p'], + undefined, + undefined, + 5_000, + ).catch(() => '') + const values = pose.trim().split(/\s+/).map(Number) + if (values.length === 6 && values.every(Number.isFinite)) return modelName + } + const output = await runCommandOutput( 'docker', [ @@ -3798,7 +3883,7 @@ async function findNav2SimulatorRobotModel(containerName: string): Promise match[1]) const robotModel = modelNames.find((modelName) => ( - /turtlebot|burger|robot/i.test(modelName) && !/world/i.test(modelName) + /turtlebot|burger|mkmini|mk-mini|robot/i.test(modelName) && !/world/i.test(modelName) )) if (!robotModel) throw new Error('Gazebo 로봇 모델을 찾을 수 없습니다.') return robotModel @@ -3815,6 +3900,10 @@ async function setNav2SimulatorPose( const containerName = await findRunningNav2SimulatorContainer() if (!containerName) throw new Error('실행 중인 NAV2 Simulator를 찾을 수 없습니다.') const robotModel = await findNav2SimulatorRobotModel(containerName) + // MK-mini's model origin is higher than TurtleBot's. Teleporting it at the + // TurtleBot ground height puts its chassis and wheels into the floor, which + // makes Gazebo eject or tip the vehicle while resolving the collision. + const spawnHeight = /^mkmini/i.test(robotModel) ? '0.16' : '0.01' await runCommand( 'docker', @@ -3823,7 +3912,7 @@ async function setNav2SimulatorPose( 'gz', 'model', '-m', robotModel, '-x', String(x), '-y', String(y), - '-z', '0.01', + '-z', spawnHeight, '-R', '0', '-P', '0', '-Y', String(yaw), @@ -5141,6 +5230,9 @@ function registerLocalWorkspaceHandlers(): void { ipcMain.handle('remote-workspace:maps:read-artifacts', (_event, target: RemoteWorkspaceTarget, artifacts: SavedMapArtifactPath[]) => ( readRemoteSavedMapArtifacts(target, artifacts) )) + ipcMain.handle('remote-workspace:maps:copy-active-rtabmap-database', (_event, target: RemoteWorkspaceTarget, localWorkspaceRoot: string | null | undefined, destinationPath: string) => ( + copyRemoteActiveRtabmapDatabaseToLocal(target, localWorkspaceRoot, destinationPath) + )) ipcMain.handle('remote-workspace:maps:sync', (_event, target: RemoteWorkspaceTarget, artifacts: SavedMapArtifactDownload[]) => ( syncRemoteSavedMapArtifacts(target, artifacts) )) @@ -5204,7 +5296,7 @@ function registerLocalWorkspaceHandlers(): void { return { ok: true } }) ipcMain.handle('local-workspace:visualization:status', () => readVisualizationBridgeStatus()) - ipcMain.handle('local-workspace:visualization:start', (_event, stack?: string | null, workspaceRoot?: string | null, rosDomainId?: string | null, environmentProfile?: EnvironmentProfileConfig | null, rosNetwork?: RosNetworkConfig | null) => startVisualizationBridge(stack, workspaceRoot, rosDomainId, environmentProfile, rosNetwork)) + ipcMain.handle('local-workspace:visualization:start', (_event, stack?: string | null, workspaceRoot?: string | null, rosDomainId?: string | null, environmentProfile?: EnvironmentProfileConfig | null, rosNetwork?: RosNetworkConfig | null, savedMapDatabasePath?: string | null) => startVisualizationBridge(stack, workspaceRoot, rosDomainId, environmentProfile, rosNetwork, savedMapDatabasePath)) ipcMain.handle('local-workspace:visualization:stop', (_event, environmentProfile?: EnvironmentProfileConfig | null) => stopVisualizationBridge(environmentProfile)) ipcMain.handle('local-workspace:git:status', (_event, moduleName: string, workspaceRoot?: string | null, folderName?: string | null, selectedFilePath?: string | null) => readWorkspaceGitStatus(moduleName, workspaceRoot, folderName, selectedFilePath)) ipcMain.handle('local-workspace:git:submit', (_event, moduleName: string, workspaceRoot?: string | null, folderName?: string | null, message?: string | null, authorName?: string | null, authorEmail?: string | null, submissionId?: string | null, repositoryUrl?: string | null) => submitWorkspaceGitChanges(moduleName, workspaceRoot, folderName, message, authorName, authorEmail, submissionId, repositoryUrl)) diff --git a/src/preload/index.ts b/src/preload/index.ts index a5f4017..772cea2 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -220,7 +220,7 @@ contextBridge.exposeInMainWorld('localWorkspace', { }, visualization: { status: () => ipcRenderer.invoke('local-workspace:visualization:status'), - start: (stack?: 'autoware' | 'nav2' | 'slam', workspaceRoot?: string, rosDomainId?: string, environmentProfile?: unknown, rosNetwork?: RosNetworkConfig | null) => ipcRenderer.invoke('local-workspace:visualization:start', stack, workspaceRoot, rosDomainId, environmentProfile, rosNetwork), + start: (stack?: 'autoware' | 'nav2' | 'slam', workspaceRoot?: string, rosDomainId?: string, environmentProfile?: unknown, rosNetwork?: RosNetworkConfig | null, savedMapDatabasePath?: string | null) => ipcRenderer.invoke('local-workspace:visualization:start', stack, workspaceRoot, rosDomainId, environmentProfile, rosNetwork, savedMapDatabasePath), stop: (environmentProfile?: unknown) => ipcRenderer.invoke('local-workspace:visualization:stop', environmentProfile) }, git: { @@ -266,6 +266,7 @@ contextBridge.exposeInMainWorld('remoteWorkspace', { }, maps: { readArtifacts: (target: RemoteWorkspaceTarget, artifacts: SavedMapArtifactPath[]) => ipcRenderer.invoke('remote-workspace:maps:read-artifacts', target, artifacts), + copyActiveRtabmapDatabaseToLocal: (target: RemoteWorkspaceTarget, localWorkspaceRoot: string | undefined, destinationPath: string) => ipcRenderer.invoke('remote-workspace:maps:copy-active-rtabmap-database', target, localWorkspaceRoot, destinationPath), sync: (target: RemoteWorkspaceTarget, artifacts: SavedMapArtifactDownload[]) => ipcRenderer.invoke('remote-workspace:maps:sync', target, artifacts) }, modules: { diff --git a/src/renderer/public/slam-viewer/assets/mk-mini.glb b/src/renderer/public/slam-viewer/assets/mk-mini.glb index c14e23d9257678b5d07ee33c757183569516f2cf..24787ac9fb19396981d38e57b39035d96ccd1519 100644 GIT binary patch delta 128028 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�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 EKT0lm_y7O^ delta 145316 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

Iua%mX4Q$#bfGKV=uQuM(u>~op)dXD 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%0D7G)n={dayjq)2P%G+iw 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 diff --git a/src/renderer/public/slam-viewer/index.html b/src/renderer/public/slam-viewer/index.html index fd81429..43ddb73 100644 --- a/src/renderer/public/slam-viewer/index.html +++ b/src/renderer/public/slam-viewer/index.html @@ -43,9 +43,51 @@ border-color:rgba(255,255,255,.34); color:#fff; } - #miniMap.hidden + #miniMapToggle { - bottom:16px; + #miniMap.hidden + #miniMapToggle { + bottom:16px; } + #cameraPreviewWrap { + position:absolute; + right:16px; + bottom:256px; + z-index:10; + display:none; + width:260px; + border:1px solid rgba(0,0,0,.45); + background:#111520; + box-shadow:0 10px 26px rgba(0,0,0,.16); + } + #cameraPreviewWrap.is-visible { display:block; } + #cameraPreviewWrap.is-collapsed { background:transparent; border-color:transparent; box-shadow:none; } + #cameraPreview { + display:block; + width:260px; + aspect-ratio:16 / 9; + object-fit:cover; + background:#111520; + } + #cameraPreviewWrap.is-collapsed #cameraPreview { display:none; } + #cameraPreviewToggle { + position:absolute; + right:0; + top:-28px; + display:grid; + width:30px; + height:28px; + place-items:center; + padding:0; + border:1px solid rgba(255,255,255,.22); + background:rgba(17,24,39,.42); + color:rgba(255,255,255,.9); + font:11px sans-serif; + font-weight:800; + cursor:pointer; + backdrop-filter:blur(8px); + box-shadow:0 10px 28px rgba(0,0,0,.16); + } + #cameraPreviewToggle:hover { color:#fff; background:rgba(255,255,255,.06); } + #cameraPreviewChevron { font-size:13px; line-height:1; } + #cameraPreviewWrap.is-collapsed #cameraPreviewChevron { transform:rotate(180deg); } #topRightControls { position:absolute; right:16px; @@ -150,6 +192,23 @@ opacity:0; pointer-events:none; } + #mapSaveOverlay { + position:fixed; + inset:0; + z-index:40; + display:flex; + align-items:center; + justify-content:center; + background:rgba(5,8,16,.46); + backdrop-filter:blur(2px); + opacity:0; + pointer-events:none; + transition:opacity .16s ease; + } + #mapSaveOverlay.is-visible { + opacity:1; + pointer-events:auto; + } .response-wait-dialog { display:flex; align-items:center; @@ -184,7 +243,6 @@ #poseToggle, #goalToggle, #obstacleToggle, - #initToggle, #cameraPresetSelect { min-height:32px; border:1px solid rgba(255,255,255,.22); @@ -203,8 +261,7 @@ #splatToggle, #poseToggle, #goalToggle, - #obstacleToggle, - #initToggle { + #obstacleToggle { padding:0 11px; } #downloadMap { @@ -216,7 +273,21 @@ display:inline-flex; align-items:center; justify-content:center; + position:absolute; + top:16px; + left:16px; + z-index:10; + width:14px; + min-width:14px; + min-height:14px; + height:14px; + padding:0; + border-color:rgba(203,213,225,.3); + border-radius:2px; + background:rgba(148,163,184,.3); + box-shadow:none; } + #splatToggle:hover { background:rgba(148,163,184,.5); border-color:rgba(226,232,240,.45); } #cameraPresetSelect { min-width:86px; padding:0 24px 0 9px; @@ -243,10 +314,14 @@ opacity:.45; cursor:not-allowed; } - #goalToggle:disabled { - opacity:.42; - cursor:not-allowed; - } + #goalToggle:disabled { + opacity:.42; + cursor:not-allowed; + } + #poseToggle:disabled { + opacity:.32; + cursor:not-allowed; + } #pathToggle.active { background:rgba(37,99,235,.62); border-color:rgba(147,197,253,.55); @@ -258,9 +333,8 @@ color:#fff; } #splatToggle.active { - background:rgba(109,40,217,.62); - border-color:rgba(196,181,253,.58); - color:#fff; + background:rgba(148,163,184,.62); + border-color:rgba(226,232,240,.58); } #goalToggle.active { background:rgba(22,163,74,.62); @@ -306,15 +380,16 @@ background:rgba(255,255,255,.1); color:#fff; } - .editor-mode #topRightControls, + .editor-mode #topRightControls, .editor-mode #miniMap, .editor-mode #miniMapToggle, + .editor-mode #cameraPreviewWrap, .editor-mode #keyGuide, .editor-mode #rosTopicStatusWrap { display:none; } #splatToggle { display:none; } - .nav2-slam #goalToggle, .nav2-slam #poseToggle, .nav2-slam #sensorToggle, .nav2-slam #initToggle { display:none; } + .nav2-slam #goalToggle, .nav2-slam #poseToggle, .nav2-slam #sensorToggle { display:none; } .nav2-navigation #downloadWrap { display:none; } .nav2-navigation #topLeftControls { display:block; } .nav2-navigation #keyGuide { display:none; } @@ -328,16 +403,15 @@
+
- -