다른 레포 형식에 맞추려면 네 레포도 시스템 내 위치 → 구성 → 설치 → 실행 → 통신 구조 → 기능 → 주의사항 순서로 작성하면 된다.
아래 내용은 현재까지 확인된 네 웹 관제 기능을 기준으로 작성한 README 초안이다. 그대로 README.md에 넣고, 실제 파일명이나 토픽명이 다르면 해당 부분만 수정하면 된다.
# S2M-Web-Monitoring
Scout2Map UGV의 지도, 로봇 위치, 센서 이벤트를 실시간으로 표시하는 웹 관제 시스템이다.
React 기반으로 동작하며, ROS2의 데이터를 rosbridge WebSocket을 통해 수신한다.
관제 사용자는 웹 브라우저에서 SLAM 지도, 로봇 위치, 센서 상태, 위험 이벤트를 확인할 수 있다.
---
## 1. 시스템 내 위치
```text
[ 센서 퓨전 MCU ] [ RPi5 / ROS2 ] [ 관제 PC ]
센서 데이터 ─────────▶ pico_bridge ──▶ /sensors/* ┐
│
[ SLAM / 위치 추정 ] │
LiDAR ────────────────▶ SLAM 노드 ──▶ /map ├─▶ rosbridge
└─▶ /tf │ WebSocket
│
[ 이벤트 엔진 ] │
센서 임계값 판단 ────────────────▶ /events ───────┘
│
▼
S2M-Web-Monitoring
지도·마커·이벤트 표시ROS2 노드는 센서 데이터와 지도, 위치, 이벤트 정보를 발행한다.
웹 관제 시스템은 ROS2 노드에 직접 연결하지 않고 rosbridge_server가 제공하는 WebSocket을 통해 ROS2 토픽을 구독한다.
이 레포의 목적은 ROS2 내부 데이터를 사용자가 브라우저에서 실시간으로 확인할 수 있도록 시각화하는 것이다.
- ROS2와 WebSocket 연결 상태 표시
- SLAM 지도 표시
- 지도 위 로봇 위치 표시
- 센서 이벤트 마커 누적 표시
- 이벤트 목록 및 상세 정보 표시
- 이벤트 종류별 구분
- 시간순 이벤트 확인
- 센서 임계값 설정 UI
- ROS2 토픽을 통한 임계값 전달
- 통신 상태 및 데이터 수신 상태 확인
대표 이벤트는 다음과 같다.
- 고온
- 가스 고농도
- 저조도
- 요철 또는 과도한 진동
- 슬립 의심
- 회전 곤란
- 통신 품질 저하
- 통신 두절
실제 이벤트 종류는 ROS2 이벤트 엔진의 정의에 따라 변경될 수 있다.
| 구분 | 기술 |
|---|---|
| Frontend | React |
| Build Tool | Vite |
| ROS2 통신 | rosbridge_suite |
| ROS2 JavaScript Client | roslib |
| 지도 시각화 | Leaflet |
| 데이터 형식 | JSON |
| 패키지 관리 | npm |
| ROS2 환경 | ROS2 Jazzy |
S2M-Web-Monitoring/
├── public/
│ ├── index.html
│ └── map/
│ └── 지도 이미지 파일
├── src/
│ ├── components/
│ │ ├── MapView
│ │ ├── EventList
│ │ ├── ConnectionStatus
│ │ └── ThresholdControl
│ ├── App.jsx
│ ├── main.jsx
│ └── App.css
├── package.json
├── package-lock.json
├── vite.config.js
├── .gitignore
└── README.md
실제 디렉토리와 파일 이름은 현재 구현 상태에 따라 다를 수 있다.
git clone https://github.com/Scout2Map/S2M-Web-Monitoring.git
cd S2M-Web-Monitoringnode -v
npm -vNode.js가 설치되어 있지 않다면 먼저 설치해야 한다.
권장 환경은 다음과 같다.
Node.js 20 이상
npm 10 이상
npm installpackage.json에 정의된 React, roslib, Leaflet 등의 패키지가 설치된다.
node_modules/는 용량이 크고 npm install로 다시 생성할 수 있으므로 GitHub에 커밋하지 않는다.
웹을 실행하기 전에 ROS2와 rosbridge가 실행되어 있어야 한다.
source /opt/ros/jazzy/setup.bashScout2Map 워크스페이스를 사용하는 경우 다음 명령도 실행한다.
source ~/scout2map_ws/install/setup.bashros2 launch rosbridge_server rosbridge_websocket_launch.xml기본 WebSocket 포트는 다음과 같다.
9090
정상적으로 실행되면 웹은 다음 주소 형태로 접속한다.
ws://ROS2_IP:9090
ROS2와 웹을 같은 컴퓨터에서 실행하는 경우 다음 주소를 사용할 수 있다.
ws://localhost:9090
ROS2와 웹을 서로 다른 컴퓨터에서 실행하는 경우 localhost 대신 ROS2가 실행되는 장치의 IP 주소를 사용해야 한다.
예시:
ws://192.168.0.10:9090
두 장치는 같은 네트워크에 연결되어 있어야 하며, 방화벽에서 9090 포트가 차단되지 않아야 한다.
개발 서버를 실행한다.
npm run dev정상적으로 실행되면 콘솔에 접속 주소가 표시된다.
예시:
Local: http://localhost:5173/
브라우저에서 해당 주소로 접속한다.
Scout2Map 시스템은 다음 순서로 실행한다.
1. 센서 퓨전 MCU 및 UGV 전원 연결
2. ROS2 워크스페이스 환경 등록
3. 센서 브릿지 노드 실행
4. SLAM 및 위치 추정 노드 실행
5. 이벤트 엔진 실행
6. rosbridge_server 실행
7. S2M-Web-Monitoring 실행
8. 브라우저에서 관제 화면 접속
웹 화면이 실행되더라도 rosbridge가 실행되지 않았다면 ROS2 데이터는 표시되지 않는다.
웹은 roslib을 이용해 rosbridge WebSocket에 연결한다.
ROS2 Topic
│
▼
rosbridge_server
│
│ JSON / WebSocket
▼
roslib
│
▼
React Component
│
▼
지도, 센서값, 이벤트 목록 표시
ROS2 메시지는 rosbridge에서 JSON 형태로 변환되어 웹에 전달된다.
현재 웹 관제 시스템에서 사용하는 주요 토픽은 다음과 같다.
| 토픽 | 용도 |
|---|---|
/map |
SLAM 지도 |
/tf |
로봇 좌표 변환 |
/events |
센서 및 상태 이벤트 |
/sensors/env_snapshot |
통합 센서 상태 |
/bridge/status |
센서 브릿지 연결 상태 |
| 임계값 설정 토픽 | 웹에서 ROS2로 임계값 전달 |
실제 토픽 이름과 메시지 타입은 ROS2 노드 구현에 따라 변경될 수 있다.
현재 사용 중인 토픽은 다음 명령으로 확인할 수 있다.
ros2 topic list특정 토픽의 메시지 타입은 다음 명령으로 확인한다.
ros2 topic type /events실제 데이터는 다음과 같이 확인한다.
ros2 topic echo /events이벤트는 이벤트 종류, 발생 위치, 센서값, 발생 시간 등을 포함한다.
예시는 다음과 같다.
{
"id": "event-001",
"type": "high_temp",
"x": 2.4,
"y": 1.8,
"value": 68.5,
"unit": "C",
"timestamp": "2026-08-05T14:30:00"
}각 필드의 의미는 다음과 같다.
| 필드 | 설명 |
|---|---|
id |
이벤트 식별값 |
type |
이벤트 종류 |
x |
지도 기준 X 좌표 |
y |
지도 기준 Y 좌표 |
value |
이벤트 발생 당시 측정값 |
unit |
측정 단위 |
timestamp |
이벤트 발생 시간 |
이벤트 메시지의 실제 필드는 이벤트 엔진의 메시지 정의와 일치해야 한다.
SLAM 지도는 ROS2의 지도 좌표계를 기준으로 한다.
웹 화면에 지도 이미지를 표시할 경우 다음 정보가 필요하다.
- 지도 이미지
- 해상도
resolution - 지도 원점
origin - 지도 크기
- 로봇의 지도 좌표
- 이벤트의 지도 좌표
ROS2의 지도 좌표와 이미지 픽셀 좌표는 기준점과 Y축 방향이 다를 수 있으므로 변환 과정이 필요하다.
ROS2 지도 좌표
│
▼
origin 및 resolution 적용
│
▼
이미지 픽셀 좌표
│
▼
Leaflet 지도 위 마커 표시
지도 정보가 변경되면 웹의 좌표 변환 설정도 동일하게 수정해야 한다.
관제 화면에서는 환경 이벤트 판단에 사용되는 임계값을 설정할 수 있다.
예시는 다음과 같다.
- 고온 기준값
- 가스 농도 기준값
- 저조도 기준값
웹에서 입력한 임계값은 ROS2 토픽으로 발행되며, 이벤트 엔진은 전달받은 값을 기준으로 이벤트를 판단한다.
웹은 임계값을 직접 판단하는 역할보다 사용자 입력과 상태 표시를 담당한다. 실제 이벤트 판정은 ROS2 측 이벤트 엔진에서 수행하는 것을 원칙으로 한다.
웹 화면의 연결 상태가 Connected로 표시되는지 확인한다.
연결되지 않을 경우 다음 항목을 확인한다.
ros2 node list목록에 rosbridge 관련 노드가 있는지 확인한다.
9090 포트가 열렸는지는 다음과 같이 확인할 수 있다.
ss -lntp | grep 9090ros2 topic echo /events터미널에는 이벤트가 출력되는데 웹에는 나오지 않는다면 다음을 확인한다.
- 웹에서 구독하는 토픽 이름
- 메시지 타입
- JSON 필드 이름
- rosbridge 연결 주소
- 브라우저 개발자 도구 콘솔 오류
지도가 표시되지 않으면 다음을 확인한다.
- 지도 이미지 파일 경로
- 파일 이름의 대소문자
public/폴더 위치- 지도 크기 설정
- Leaflet 이미지 오버레이 범위
증상: WebSocket connection failed
확인 항목:
- rosbridge가 실행 중인지 확인
- WebSocket 주소와 포트 확인
- ROS2 장치 IP 주소 확인
- 두 장치가 같은 네트워크인지 확인
- 방화벽의 9090 포트 확인
확인 항목:
- ROS2 토픽이 실제로 발행되고 있는지 확인
- 웹 코드의 토픽 이름 확인
- ROS2 메시지 타입 확인
- 이벤트 JSON 형식 확인
의존성 설치 상태를 초기화하고 다시 설치한다.
Windows CMD:
rmdir /s /q node_modules
del package-lock.json
npm installUbuntu:
rm -rf node_modules
rm package-lock.json
npm install개발 서버를 종료한 뒤 다시 실행한다.
npm run dev브라우저 캐시가 남아 있으면 강력 새로고침을 수행한다.
Ctrl + Shift + R
배포용 파일을 생성하려면 다음 명령을 실행한다.
npm run build정상적으로 빌드되면 dist/ 디렉토리가 생성된다.
로컬에서 배포 결과를 확인하려면 다음 명령을 사용한다.
npm run previewdist/는 빌드할 때 다시 생성할 수 있으므로 일반적으로 GitHub에 커밋하지 않는다.
다음 파일과 디렉토리는 GitHub에 올리지 않는다.
node_modules/
dist/
.env
.env.local
.vscode/
*.log
.gitignore 예시는 다음과 같다.
node_modules/
dist/
.env
.env.local
.vscode/
*.logWebSocket IP 주소나 환경별 설정값을 .env에 저장하는 경우 실제 .env 파일은 올리지 않고 예시 파일만 제공한다.
.env.example
예시:
VITE_ROSBRIDGE_URL=ws://localhost:9090팀 저장소의 최신 변경 사항을 먼저 가져온다.
git pull기능별 브랜치를 만든다.
git checkout -b feature/event-filter수정 후 커밋한다.
git add .
git commit -m "Add event type filter"
git push origin feature/event-filter그다음 GitHub에서 Pull Request를 생성해 main 브랜치에 병합한다.
여러 명이 동시에 main 브랜치를 직접 수정하면 충돌이 발생할 수 있으므로 기능별 브랜치 사용을 권장한다.
README에서 특히 수정이 필요한 부분은 다음이야.
1. 실제 폴더 구조
2. 현재 사용 중인 토픽 이름
3. `/events` 메시지의 실제 JSON 필드
4. ROS WebSocket 주소를 코드에 직접 적었는지 `.env`로 관리하는지
5. CRA를 쓰는지 Vite를 쓰는지
6. 실제 지도 파일 경로
네 레포는 다른 MCU·브릿지 레포와 달리 **하드웨어 설치 설명보다 ROS2-WebSocket 연결 방식, 토픽, 실행 순서, 화면 기능 설명**이 중심이 되어야 한다.