esp32 webteleop - dingdongdengdong/astra_ws GitHub Wiki
ํต์ฌ ๊ตฌ์ฑ ์์:
-
ESP32 (๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ):
- ๋ก๋ด์ ๋ชจํฐ, ์ผ์ ๋ฑ ํ๋์จ์ด๋ฅผ ์ง์ ์ ์ดํฉ๋๋ค.
- Wi-Fi๋ฅผ ํตํด ๋คํธ์ํฌ์ ์ฐ๊ฒฐ๋ฉ๋๋ค.
- ์น์์ผ(WebSocket) ๋๋ HTTP ์์ฒญ์ ํตํด ์น ์๋ฒ(๋๋ ์ง์ ์น ๋ธ๋ผ์ฐ์ )์ ํต์ ํ์ฌ ์ ์ด ๋ช ๋ น์ ์์ ํ๊ณ , ๋ก๋ด์ ์ํ ์ ๋ณด(์ผ์ ๊ฐ ๋ฑ)๋ฅผ ์ก์ ํฉ๋๋ค.
- ESP32์ ์ ๋ก๋๋ ํ์จ์ด๋ ์์ ๋ ๋ช ๋ น์ ํด์ํ์ฌ ๋ชจํฐ๋ฅผ ๊ตฌ๋ํ๊ฑฐ๋ LED๋ฅผ ์ ์ดํ๋ ๋ฑ์ ๋์์ ์ํํฉ๋๋ค.
-
์น ๋ธ๋ผ์ฐ์ (์ฌ์ฉ์ ์ธํฐํ์ด์ค):
- ์ฌ์ฉ์๊ฐ ๋ก๋ด์ ์๊ฒฉ์ผ๋ก ์กฐ์ข
ํ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. (์:
non_ros_src/astra_teleop_web/src/astra_teleop_web/static/index.html
) - HTML, CSS, JavaScript๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์ฌ์ฉ์์ ์ ๋ ฅ(๋ฒํผ ํด๋ฆญ, ์ฌ๋ผ์ด๋ ์กฐ์ ๋ฑ)์ ๊ฐ์งํฉ๋๋ค.
- JavaScript๋ฅผ ์ฌ์ฉํ์ฌ ์น์์ผ์ ํตํด ESP32 ๋๋ ์ค๊ฐ ์๋ฒ(ROS2 ๋ ธ๋)๋ก ์ ์ด ๋ช ๋ น์ ์ ์กํฉ๋๋ค.
- ํ์์ ๋ฐ๋ผ ESP32๋ก๋ถํฐ ๋ก๋ด ์ํ ์ ๋ณด๋ฅผ ๋ฐ์ ํ๋ฉด์ ํ์ํ ์ ์์ต๋๋ค (์: ๋ฐฐํฐ๋ฆฌ ์๋, ์ผ์ ๊ฐ, ์นด๋ฉ๋ผ ์์ ์คํธ๋ฆฌ๋ฐ).
- ์ฌ์ฉ์๊ฐ ๋ก๋ด์ ์๊ฒฉ์ผ๋ก ์กฐ์ข
ํ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. (์:
-
teleop_web_node.py
(ROS2 ์น ์๊ฒฉ ์กฐ์ข ๋ ธ๋):- ROS2 ์์คํ
๊ณผ ์น ์ธํฐํ์ด์ค, ๊ทธ๋ฆฌ๊ณ ESP32 ๊ฐ์ ์ค๊ฐ ๋ค๋ฆฌ ์ญํ ์ ํฉ๋๋ค. ์ด ๋
ธ๋๋
astra_controller
ํจํค์ง์ ํฌํจ๋์ด ์์ต๋๋ค. -
์น ์๋ฒ ์ญํ : ์น ๋ธ๋ผ์ฐ์ (ํด๋ผ์ด์ธํธ)๋ก๋ถํฐ ์น์์ผ ๋๋ HTTP ์์ฒญ์ ์์ ํฉ๋๋ค. (Python์
aiohttp
,flask
,fastapi
๋ฑ์ ์น ํ๋ ์์ํฌ์ ์น์์ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ) -
ROS2 ํผ๋ธ๋ฆฌ์
/์๋ธ์คํฌ๋ผ์ด๋ฒ:
- ์น ๋ธ๋ผ์ฐ์ ๋ก๋ถํฐ ๋ฐ์ ์ ์ด ๋ช
๋ น (์: ์ ์ง, ํ์ง, ์ขํ์ , ์ฐํ์ , ํ/ํค๋ ๊ฐ๋ ์กฐ์ )์ ROS2 ํ ํฝ (์:
/cmd_vel
,/joint_command
)์ผ๋ก ๋ฐํํ์ฌ ๋ก๋ด์ ๋ค๋ฅธ ์ ์ด ๋ ธ๋(head_node.py
,arm_node.py
๋ฑ)๋ก ์ ๋ฌํฉ๋๋ค. - ESP32์ ์ง์ ํต์ ํ๋ ๊ฒฝ์ฐ, ์์ ํ ์น ๋ช ๋ น์ ESP32๊ฐ ์ดํดํ ์ ์๋ ํํ๋ก ๋ณํํ์ฌ ์๋ฆฌ์ผ ๋๋ ๋คํธ์ํฌ(TCP/IP, UDP, ์น์์ผ)๋ฅผ ํตํด ESP32๋ก ์ ์กํฉ๋๋ค.
- (์ ํ ์ฌํญ) ESP32๋ก๋ถํฐ ๋ก๋ด์ ์ํ ์ ๋ณด๋ฅผ ๋ฐ์ ์ด๋ฅผ ์น ๋ธ๋ผ์ฐ์ ๋ก ์ ์กํ๊ฑฐ๋ ๋ค๋ฅธ ROS2 ๋ ธ๋์์ ์ฌ์ฉํ ์ ์๋๋ก ํน์ ํ ํฝ์ผ๋ก ๋ฐํํ ์ ์์ต๋๋ค.
- ์น ๋ธ๋ผ์ฐ์ ๋ก๋ถํฐ ๋ฐ์ ์ ์ด ๋ช
๋ น (์: ์ ์ง, ํ์ง, ์ขํ์ , ์ฐํ์ , ํ/ํค๋ ๊ฐ๋ ์กฐ์ )์ ROS2 ํ ํฝ (์:
- ROS2 ์์คํ
๊ณผ ์น ์ธํฐํ์ด์ค, ๊ทธ๋ฆฌ๊ณ ESP32 ๊ฐ์ ์ค๊ฐ ๋ค๋ฆฌ ์ญํ ์ ํฉ๋๋ค. ์ด ๋
ธ๋๋
-
(์ ํ ์ฌํญ)
astra_teleop_web/src/astra_teleop_web/webserver.py
๋ฐteleoperator.py
:-
non_ros_src
์ ์๋ ์ด ์ฝ๋๋ ROS2์ ์ง์ ์ ์ธ ์ฐ๊ด์ด ์์ ์๋ ์์ง๋ง, ๋ ๋ฆฝ์ ์ธ ์น ๊ธฐ๋ฐ ์๊ฒฉ ์กฐ์ข ์์คํ ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. -
webserver.py
: Python ๊ธฐ๋ฐ์ ์น ์๋ฒ(Flask, aiohttp ๋ฑ)๋ฅผ ์คํํ์ฌstatic/index.html
๊ณผ ๊ฐ์ ์ ์ ํ์ผ์ ์ ๊ณตํ๊ณ , ์น์์ผ ๋๋ HTTP ์๋ํฌ์ธํธ๋ฅผ ํตํด ํด๋ผ์ด์ธํธ(์น ๋ธ๋ผ์ฐ์ , ESP32)์ ํต์ ํฉ๋๋ค. -
teleoperator.py
: ์น ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ๋ช ๋ น์ ์ฒ๋ฆฌํ๊ฑฐ๋, ESP32์ ์ง์ ํต์ ํ๋ ๋ก์ง์ ๋ด๋นํ ์ ์์ต๋๋ค.
-
๋ฐ์ดํฐ ์ก์์ ๋ฐ ๊ตฌ๋ ๋ฐฉ์ ๋ค์ด์ด๊ทธ๋จ:
์๋ ๋ค์ด์ด๊ทธ๋จ์ ๋ ๊ฐ์ง ์ฃผ์ ์๋๋ฆฌ์ค๋ฅผ ๋ณด์ฌ์ค๋๋ค.
-
์๋๋ฆฌ์ค 1: ์น ๋ธ๋ผ์ฐ์ ->
teleop_web_node.py
(ROS2) -> ๋ก๋ด ์ ์ด ๋ ธ๋ -> ESP32 (๋๋ ์ง์ ํ๋์จ์ด) (ROS2 ์์คํ ์ ํตํฉ๋ ๊ฒฝ์ฐ) -
์๋๋ฆฌ์ค 2: ์น ๋ธ๋ผ์ฐ์ ->
astra_teleop_web/webserver.py
-> ESP32 (๋ ๋ฆฝ์ ์ธ ์น ์กฐ์ข ์์คํ ์ ๊ฒฝ์ฐ, ๋๋teleop_web_node.py
๊ฐ ์ด ์ญํ ์ ๊ฒธํ๋ ๊ฒฝ์ฐ)
graph TD
%% ์ ์ฒด ๊ทธ๋ํ ๋ฐฉํฅ ์ค์ (Set overall graph direction)
direction TB
%% ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์๋ธ๊ทธ๋ํ (User Interface Subgraph)
subgraph "์ฌ์ฉ์ ์ธํฐํ์ด์ค (User Interface)"
direction LR
A[์น ๋ธ๋ผ์ฐ์ - index.html, JS]
end
%% ๋คํธ์ํฌ ํต์ ์๋ธ๊ทธ๋ํ (Network Communication Subgraph)
subgraph "๋คํธ์ํฌ ํต์ (Network Communication)"
direction LR
B[Websocket, HTTP]
end
%% ์๋ฒ ๋ฐ ROS2 ํตํฉ ์๋ธ๊ทธ๋ํ (Server-Side/ROS2 Integration Subgraph)
subgraph "์๋ฒ/ROS2 ํตํฉ (Server-Side/ROS2 Integration)"
direction LR
C[teleop_web_node.py - ROS2]
D[webserver.py - Non-ROS]
end
%% ROS2 ์์คํ
์๋ธ๊ทธ๋ํ (ROS2 System Subgraph)
subgraph "ROS2 ์์คํ
(ROS2 System)"
direction LR
E[ROS2 ๋
ธ๋ - head_node, arm_node, base_node]
F[ROS2 ํ ํฝ - cmd_vel, joint_command]
end
%% ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ ๋ฐ ํ๋์จ์ด ์๋ธ๊ทธ๋ํ (Microcontroller/Hardware Subgraph)
subgraph "๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ/ํ๋์จ์ด (Microcontroller/Hardware)"
direction LR
G[ESP32]
H[๋ก๋ด ๋ชจํฐ, ์ผ์]
end
%% ์ฐ๊ฒฐ (Connections)
A -->|"์ ์ด ๋ช
๋ น - JSON, Text"| B
B -->|"์น ๋ช
๋ น"| C
B -->|"์น ๋ช
๋ น"| D
%% ์๋๋ฆฌ์ค 1: teleop_web_node.py๋ฅผ ํตํ ROS2 ํตํฉ (Scenario 1: ROS2 Integration via teleop_web_node.py)
C -->|"ํ์ฑ๋ ๋ช
๋ น"| F
F --> E
E -->|"์ ์์ค ๋ช
๋ น - Serial, CAN, I2C"| G
%% ๋์ฒด ๊ฒฝ๋ก: teleop_web_node์์ ์ง์ ์ ์ด (Alternative path: Direct control from teleop_web_node)
C -->|"์ง์ ๋ช
๋ น - Serial, TCP, UDP, Websocket"| G
%% ์๋๋ฆฌ์ค 2: ๋
๋ฆฝ ์น ์๋ฒ (Scenario 2: Standalone Web Server)
D -->|"ํ์ฑ๋ ๋ช
๋ น - Serial, TCP, UDP, Websocket"| G
%% ํ๋์จ์ด ์ํธ์์ฉ (Hardware Interactions)
G -->|"์ ์ด ์ ํธ"| H
H -->|"์ผ์ ๋ฐ์ดํฐ"| G
G -->|"์ํ, ์ผ์ ๋ฐ์ดํฐ - Websocket, TCP, UDP, Serial"| C
G -->|"์ํ, ์ผ์ ๋ฐ์ดํฐ - Websocket, HTTP"| D
D -->|"์ํ, ์ผ์ ๋ฐ์ดํฐ"| B
C -->|"์ํ, ์ผ์ ๋ฐ์ดํฐ - Websocket ๋๋ ROS2 ํ ํฝ"| B
B -->|"ํ๋ฉด ์
๋ฐ์ดํธ, ๋ก๋ด ์ํ"| A
%% ์คํ์ผ๋ง (Styling)
classDef ui fill:#D5F5E3,stroke:#28B463,stroke-width:2px
classDef network fill:#E8DAEF,stroke:#8E44AD,stroke-width:2px
classDef ros fill:#D6EAF8,stroke:#2E86C1,stroke-width:2px
classDef hardware fill:#FDEDEC,stroke:#CB4335,stroke-width:2px
classDef topic fill:#FEF9E7,stroke:#F39C12,stroke-width:1px
class A ui
class B network
class C,E ros
class D ros
class F topic
class G,H hardware
๋ฐ์ดํฐ ์ก์์ ๋ฐ ๊ตฌ๋ ์์ธ ์ค๋ช :
-
์ฌ์ฉ์ ์ ๋ ฅ (A -> B):
- ์ฌ์ฉ์๋ ์น ๋ธ๋ผ์ฐ์ (A)์ ๋ก๋๋
index.html
ํ์ด์ง์ ๋ฒํผ(์ ์ง, ํ์ง, ํค๋ ์ฌ๋ฆผ ๋ฑ)์ ํด๋ฆญํ๊ฑฐ๋ ์ฌ๋ผ์ด๋๋ฅผ ์กฐ์ํฉ๋๋ค. - ๋ธ๋ผ์ฐ์ ์ JavaScript (
index.js
๋ฑ)๋ ์ด ์ ๋ ฅ์ ๊ฐ์งํ์ฌ ํน์ ํ์(์ฃผ๋ก JSON ๋๋ ๊ฐ๋จํ ๋ฌธ์์ด)์ ์ ์ด ๋ฉ์์ง๋ฅผ ์์ฑํฉ๋๋ค. - ์์ฑ๋ ๋ฉ์์ง๋ ์น์์ผ(์ค์๊ฐ ์๋ฐฉํฅ ํต์ ์ ์ ๋ฆฌ) ๋๋ HTTP POST/GET ์์ฒญ(B)์ ํตํด ์๋ฒ๋ก ์ ์ก๋ฉ๋๋ค. ์น์์ผ ์ฃผ์๋ HTTP URL์ JavaScript ์ฝ๋์ ๋ช ์๋์ด ์์ต๋๋ค.
- ์ฌ์ฉ์๋ ์น ๋ธ๋ผ์ฐ์ (A)์ ๋ก๋๋
-
์๋ฒ์์์ ๋ช ๋ น ์์ ๋ฐ ์ฒ๋ฆฌ (B -> C ๋๋ B -> D):
-
teleop_web_node.py
(C)์ ๊ฒฝ์ฐ (ROS2 ํตํฉ):- ์ด Python ์คํฌ๋ฆฝํธ๋ ์น ์๋ฒ(์:
aiohttp
์๋ฒ)๋ฅผ ๋ด์ฅํ๊ณ ์์ด ํน์ ํฌํธ์์ ์น์์ผ ์ฐ๊ฒฐ ๋๋ HTTP ์์ฒญ์ ์์ ๋๊ธฐํฉ๋๋ค. - ์น ๋ธ๋ผ์ฐ์ ๋ก๋ถํฐ ์ ์ด ๋ฉ์์ง๋ฅผ ๋ฐ์ผ๋ฉด, ์ด๋ฅผ ํ์ฑํ์ฌ ๋ก๋ด์ ์ด๋ค ๋ถ๋ถ์ ์ด๋ป๊ฒ ์์ง์ผ์ง์ ๋ํ ์ ๋ณด(์: ์ ์๋, ๊ฐ์๋, ๋ชฉํ ์กฐ์ธํธ ๊ฐ๋)๋ฅผ ์ถ์ถํฉ๋๋ค.
- ์ถ์ถ๋ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ ์ ํ ROS2 ๋ฉ์์ง ํ์
(์:
geometry_msgs/msg/Twist
๋๋astra_controller_interfaces/msg/JointCommand
)์ ์์ฑํฉ๋๋ค. - ์์ฑ๋ ROS2 ๋ฉ์์ง๋ฅผ ํด๋น ์ ์ด ํ ํฝ(F) (์:
/cmd_vel
๋๋/joint_command
)์ผ๋ก ๋ฐํ(publish)ํฉ๋๋ค. - ๋ง์ฝ ESP32์ ์ง์ ํต์ ํด์ผ ํ๋ ๋ถ๋ถ์ด ์๋ค๋ฉด (์: ํน์ GPIO ํ ์ ์ด), ROS2 ํ ํฝ ๋ฐํ ๋์ ๋๋ ์ถ๊ฐ์ ์ผ๋ก ESP32๋ก ์ง์ ๋ช
๋ น์ ์ ์กํ ์๋ ์์ต๋๋ค. (์ด ๊ฒฝ์ฐ
teleop_web_node.py
๊ฐ ESP32์์ ํต์ ๋ก์ง๋ ๋ด๋น)
- ์ด Python ์คํฌ๋ฆฝํธ๋ ์น ์๋ฒ(์:
-
astra_teleop_web/webserver.py
(D)์ ๊ฒฝ์ฐ (๋ ๋ฆฝ ์คํ ๋๋teleop_web_node.py
๊ฐ ์ด ์ญํ ์ํ):- ์ด Python ์คํฌ๋ฆฝํธ๊ฐ ์น ์๋ฒ ์ญํ ์ ํ๋ฉฐ ์น ๋ธ๋ผ์ฐ์ ๋ก๋ถํฐ ์ง์ ๋ช ๋ น์ ์์ ํฉ๋๋ค.
- ์์ ๋ ๋ช ๋ น์ ESP32๊ฐ ์ดํดํ ์ ์๋ ํ๋กํ ์ฝ(์: ๊ฐ๋จํ ๋ฌธ์์ด ๋ช ๋ น "FORWARD", "LEFT", ๋๋ JSON ๊ฐ์ฒด)๋ก ๋ณํํฉ๋๋ค.
- ๋ณํ๋ ๋ช ๋ น์ Wi-Fi๋ฅผ ํตํด ESP32(G)๋ก ์ ์กํฉ๋๋ค. ํต์ ๋ฐฉ์์ ESP32 ํ์จ์ด์ ๋ง์ถฐ ์น์์ผ ํด๋ผ์ด์ธํธ, TCP ํด๋ผ์ด์ธํธ, UDP ํจํท ๋ฑ์ผ๋ก ๊ตฌํ๋ ์ ์์ต๋๋ค.
-
-
ROS2 ์์คํ ๋ด์์์ ์ ์ด (C -> F -> E -> G, ๋๋ C -> G):
-
teleop_web_node.py
(C)๊ฐ ROS2 ํ ํฝ(F)์ผ๋ก ๋ช ๋ น์ ๋ฐํํ๋ฉด, ํด๋น ํ ํฝ์ ๊ตฌ๋ ํ๊ณ ์๋ ๋ก๋ด์ ์ค์ ์ ์ด ๋ ธ๋๋ค(E) (์:head_node.py
,arm_node.py
,base_node.py
)์ด ์ด ๋ช ๋ น์ ์์ ํฉ๋๋ค. - ๊ฐ ์ ์ด ๋
ธ๋๋ ์์ ๋ ๋ช
๋ น์ ๋ฐ๋ผ ์์ ์ ๋ด๋น ๋ถ๋ถ(ํค๋, ํ, ๋ฒ ์ด์ค ๋ฑ)์ ์ ์ดํ๊ธฐ ์ํด
head_controller.py
,arm_controller.py
,base_controller.py
๋ฑ์ ์ ์์ค ์ปจํธ๋กค๋ฌ ํด๋์ค๋ฅผ ํธ์ถํฉ๋๋ค. - ์ด ์ ์์ค ์ปจํธ๋กค๋ฌ๋ค์ ์๋ฆฌ์ผ, CAN, I2C ๋ฑ์ ํต์ ๋ฐฉ์์ ํตํด ์ค์ ํ๋์จ์ด(๋ชจํฐ ๋๋ผ์ด๋ฒ ๋ฑ) ๋๋ ESP32(G)์ ํต์ ํ์ฌ ๋ช ๋ น์ ์ ๋ฌํฉ๋๋ค.
- ๋ง์ฝ
teleop_web_node.py
๊ฐ ESP32์ ์ง์ ํต์ ํ๋๋ก ์ค๊ณ๋์๋ค๋ฉด, ์ด ๋จ๊ณ์์ ๋ฐ๋ก ESP32๋ก ๋ช ๋ น์ ์ ๋ฌํฉ๋๋ค.
-
-
ESP32์์์ ๋ช ๋ น ์คํ (G -> H):
- ESP32(G)๋ Wi-Fi๋ฅผ ํตํด ์น ์๋ฒ(
teleop_web_node.py
๋๋astra_teleop_web/webserver.py
)๋ก๋ถํฐ ์ ์ด ๋ช ๋ น์ ์์ ํฉ๋๋ค. - ESP32์ ํ๋ก๊ทธ๋๋ฐ๋ ํ์จ์ด๋ ์์ ๋ ๋ช ๋ น์ ํด์ํฉ๋๋ค (์: "FORWARD" ๋ช ๋ น์ ๋ฐ์ผ๋ฉด ํน์ GPIO ํ๋ค์ ์ ์ดํ์ฌ ๋ชจํฐ ๋๋ผ์ด๋ฒ์ ์ ํธ๋ฅผ ๋ณด๋).
- ํด์๋ ๋ช ๋ น์ ๋ฐ๋ผ ์ฐ๊ฒฐ๋ ๋ชจํฐ(H)๋ฅผ ๊ตฌ๋์ํค๊ฑฐ๋, LED๋ฅผ ์ผ๊ฑฐ๋, ๋ค๋ฅธ ์ก์ถ์์ดํฐ๋ฅผ ์๋์ํต๋๋ค.
- ESP32(G)๋ Wi-Fi๋ฅผ ํตํด ์น ์๋ฒ(
-
์ํ ์ ๋ณด ์ก์ (H -> G -> D/C -> B -> A) (์ ํ ์ฌํญ):
- ๋ก๋ด์ ์ผ์(H) (์: ๋ฐฐํฐ๋ฆฌ ์ ์ ์ผ์, ๊ฑฐ๋ฆฌ ์ผ์, ์์ฝ๋) ๊ฐ์ ESP32(G)์์ ์ฝํ ์ ์์ต๋๋ค.
- ESP32๋ ์ด ์ํ ์ ๋ณด๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ๋๋ ์์ฒญ์ ๋ฐ๋ผ Wi-Fi๋ฅผ ํตํด ์น ์๋ฒ(D ๋๋ C)๋ก ์ ์กํ ์ ์์ต๋๋ค.
- ์น ์๋ฒ(D ๋๋ C)๋ ์์ ๋ ์ํ ์ ๋ณด๋ฅผ ์น์์ผ์ด๋ HTTP ์๋ต์ ํตํด ์น ๋ธ๋ผ์ฐ์ (A)๋ก ์ ๋ฌํฉ๋๋ค.
- ์น ๋ธ๋ผ์ฐ์ ์ JavaScript๋ ์ด ์ ๋ณด๋ฅผ ๋ฐ์ ํ๋ฉด์ ํ์ํ์ฌ ์ฌ์ฉ์์๊ฒ ๋ก๋ด์ ํ์ฌ ์ํ๋ฅผ ์๋ ค์ค๋๋ค.
-
teleop_web_node.py
(C)์ ๊ฒฝ์ฐ, ESP32๋ก๋ถํฐ ๋ฐ์ ์ผ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ROS2 ๋ ธ๋์์ ํ์ฉํ ์ ์๋๋ก ํน์ ROS2 ํ ํฝ์ผ๋ก ๋ฐํํ ์๋ ์์ต๋๋ค.
์คํ ๋จ๊ณ (์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค):
-
ESP32 ์ค๋น:
- ESP32์ Wi-Fi ์ ์ ์ ๋ณด(SSID, ๋น๋ฐ๋ฒํธ)์ ์น ์๋ฒ ์ฃผ์(IP, ํฌํธ)๋ฅผ ์ค์ ํ๊ณ , ์ ์ด ๋ช ๋ น ์์ ๋ฐ ํ๋์จ์ด ์ ์ด ๋ก์ง์ด ํฌํจ๋ ํ์จ์ด๋ฅผ ์ ๋ก๋ํฉ๋๋ค.
- ESP32๊ฐ ๋คํธ์ํฌ์ ์ฐ๊ฒฐ๋๊ณ ์น ์๋ฒ๋ก๋ถํฐ ๋ช ๋ น์ ๋ฐ์ ์ค๋น๋ฅผ ํฉ๋๋ค.
-
์น ์๊ฒฉ ์กฐ์ข ์๋ฒ ์คํ:
-
ROS2 ํ๊ฒฝ:
(ํ์์ ๋ฐ๋ผ launch ํ์ผ์ ํตํด ๊ด๋ จ ๋ ธ๋๋ค๊ณผ ํจ๊ป ์คํ๋ ์ ์์ต๋๋ค: ์:
source /opt/ros/<your_ros_distro>/setup.bash source <path_to_your_astra_ws>/install/setup.bash ros2 run astra_controller teleop_web_node
ros2 launch astra_controller start.launch.py
) -
๋
๋ฆฝ ์คํ ํ๊ฒฝ (Non-ROS,
astra_teleop_web
์ฌ์ฉ ์):(์คํ ๋ช ๋ น์ด๋ ํด๋น ์คํฌ๋ฆฝํธ์ ๊ตฌํ ๋ฐฉ์์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค.)cd <path_to_your_astra_ws>/non_ros_src/astra_teleop_web/src/astra_teleop_web python webserver.py
- ์๋ฒ๊ฐ ์คํ๋๋ฉด ํน์ IP ์ฃผ์์ ํฌํธ์์ ์น ์์ฒญ์ ๊ธฐ๋ค๋ฆฝ๋๋ค. (ํฐ๋ฏธ๋ ๋ก๊ทธ์์ ์ฃผ์ ํ์ธ)
-
ROS2 ํ๊ฒฝ:
-
์น ๋ธ๋ผ์ฐ์ ์ ์:
- PC ๋๋ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด๊ณ , ์น ์๋ฒ๊ฐ ์คํ ์ค์ธ ์ฃผ์ (์:
http://<์๋ฒ_IP_์ฃผ์>:<ํฌํธ๋ฒํธ>
, ์๋ฅผ ๋ค์ดhttp://192.168.1.100:8080
)๋ก ์ ์ํฉ๋๋ค. -
index.html
ํ์ด์ง๊ฐ ๋ก๋๋๊ณ , ์ฌ์ฉ์๋ ํ๋ฉด์ ์ปจํธ๋กค์ ์ฌ์ฉํ์ฌ ๋ก๋ด ์กฐ์ข ์ ์์ํ ์ ์์ต๋๋ค.
- PC ๋๋ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด๊ณ , ์น ์๋ฒ๊ฐ ์คํ ์ค์ธ ์ฃผ์ (์:
์ฃผ์ ๊ธฐ์ :
- ESP32: Wi-Fi ํต์ , GPIO ์ ์ด, ์ผ์ ์ธํฐํ์ด์ค.
- ์น ๊ธฐ์ : HTML, CSS, JavaScript (ํ๋ก ํธ์๋ UI).
-
ํต์ ํ๋กํ ์ฝ:
- ์น์์ผ (WebSockets): ์น ๋ธ๋ผ์ฐ์ ์ ์๋ฒ ๊ฐ ์ค์๊ฐ ์๋ฐฉํฅ ํต์ ์ ์ฃผ๋ก ์ฌ์ฉ. ๋ฎ์ ์ง์ฐ ์๊ฐ.
- HTTP (HyperText Transfer Protocol): ์์ฒญ-์๋ต ๊ธฐ๋ฐ ํต์ . ๊ฐ๋จํ ๋ช ๋ น ์ ์ก์ ์ฌ์ฉ๋ ์ ์์.
- TCP/IP ๋๋ UDP: ์๋ฒ(Python ์คํฌ๋ฆฝํธ)์ ESP32 ๊ฐ์ ์ง์ ์ ์ธ ๋คํธ์ํฌ ํต์ ์ ์ฌ์ฉ๋ ์ ์์.
-
Python (์๋ฒ ์ฌ์ด๋):
- ์น ํ๋ ์์ํฌ:
aiohttp
(๋น๋๊ธฐ,teleop_web_node.py
์์ ์ฌ์ฉ ๊ฐ๋ฅ์ฑ ๋์),Flask
,FastAPI
๋ฑ. - ์น์์ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ:
websockets
,aiohttp-websockets
๋ฑ. - ROS2 ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ:
rclpy
. - (ํ์์) ์๋ฆฌ์ผ ํต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ:
pyserial
.
- ์น ํ๋ ์์ํฌ:
์ด ๋ค์ด์ด๊ทธ๋จ๊ณผ ์ค๋ช
์ ESP32์ ์น์ ์ฌ์ฉํ ์๊ฒฉ ์กฐ์ข
์์คํ
์ ์ผ๋ฐ์ ์ธ ์ํคํ
์ฒ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ค์ ๊ตฌํ์ ์ ๊ณต๋ ์ฝ๋์ ์ธ๋ถ ์ฌํญ์ ๋ฐ๋ผ ๋ค์ ์ฐจ์ด๊ฐ ์์ ์ ์์ผ๋ฏ๋ก, teleop_web_node.py
์ astra_teleop_web
๋๋ ํ ๋ฆฌ ๋ด์ Python ์คํฌ๋ฆฝํธ ๋ฐ HTML/JavaScript ํ์ผ๋ค์ ๋ด์ฉ์ ํจ๊ป ์ดํด๋ณด์๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.