같은 망에서 사용하는가 - dingdongdengdong/astra_ws GitHub Wiki
현재 코드의 통신 방식 및 망(네트워크) 조건
제공된 코드 (webserver.py
및 teleop_web_node.py
)를 분석했을 때, 이 시스템은 로컬 네트워크 또는 동일한 장치 내에서의 통신을 기본으로 설계되었습니다. 이는 주로 WebRTC와 ROS 2의 통신 특성 때문입니다.
-
WebRTC (웹 브라우저 ↔ WebServer):
webserver.py
는aiohttp.web
을 사용하여 웹 서버를 구축하고aiortc
를 사용하여 WebRTC 통신을 처리합니다.- WebRTC는 기본적으로 P2P(Peer-to-Peer) 통신을 지향하지만, 초기 연결 설정(시그널링)을 위해 서버가 필요합니다. 이 코드에서는
webserver.py
자체가 시그널링 서버 역할을 겸합니다. - WebRTC는 NAT(Network Address Translation) 통과를 위해 STUN/TURN 서버를 사용할 수 있지만, 제공된
webserver.py
코드에서는 명시적으로 STUN/TURN 서버 설정이 보이지 않습니다. 이는 기본적으로 동일한 로컬 네트워크 (LAN) 내에서 통신이 원활하게 이루어지도록 설계되었음을 의미합니다. 외부망에서 접근하려면 추가적인 STUN/TURN 서버 설정과 방화벽 설정이 필요합니다. - 카메라 영상 스트리밍(
FeedableVideoStreamTrack
) 또한 WebRTC를 통해 이루어지므로, 안정적인 스트리밍을 위해서는 낮은 지연 시간과 충분한 대역폭을 가진 네트워크 환경이 중요합니다.
-
ROS 2 (teleop_web_node ↔ 다른 ROS 2 노드):
teleop_web_node.py
는 ROS 2 노드이며, 로봇의 다른 제어 노드들과 ROS 2 토픽을 통해 통신합니다.- ROS 2는 기본적으로 DDS(Data Distribution Service)를 사용하여 메시지를 교환합니다. DDS는 같은 서브넷(Subnet) 내에 있는 장치들 간에 자동으로 통신을 검색하고 설정하는 기능을 가지고 있습니다 (Multicast discovery).
- 따라서,
teleop_web_node
와 로봇의 다른 제어 노드들(예:arm_controller
,base_controller
)은 물리적으로나 논리적으로 동일한 네트워크 망 안에 있어야 정상적으로 통신할 수 있습니다. 서로 다른 망에 있거나 방화벽으로 차단되어 있으면 통신이 불가능합니다.
특정 서버 및 포트 명시 여부
webserver.py
파일을 살펴보면, 웹 서버를 바인딩하고 리스닝하는 부분이 있습니다.
# astra_ws.zip/non_ros_src/astra_teleop_web/src/astra_teleop_web/webserver.py
# (부분 발췌)
async def main():
parser = argparse.ArgumentParser(description="WebRTC audio / video / data-channels demo")
parser.add_argument("--host", default="0.0.0.0", help="Host for HTTP server (default: 0.0.0.0)")
parser.add_argument("--port", type=int, default=8080, help="Port for HTTP server (default: 8080)")
parser.add_argument("--verbose", "-v", action="count", help="Increase verbosity")
# ... (생략) ...
app = aiohttp.web.Application()
app.router.add_get("/", index)
app.router.add_get("/client.js", javascript)
app.router.add_post("/offer", offer)
# ... (생략) ...
try:
await aiohttp.web.run_app(
app, access_log=None, host=args.host, port=args.port, ssl_context=ssl_context
)
except Exception as e:
logger.error(f"Failed to start web server: {e}")
--host
: 기본값은"0.0.0.0"
으로 설정되어 있습니다."0.0.0.0"
은 해당 서버가 모든 사용 가능한 네트워크 인터페이스(IP 주소)를 통해 들어오는 연결을 수락하겠다는 의미입니다. 즉, 로봇에 여러 IP 주소가 있더라도, 해당 로봇의 어떤 IP 주소로 접근하더라도 웹 서버에 접속할 수 있습니다.--port
: 기본값은8080
으로 설정되어 있습니다. 따라서 웹 서버는 기본적으로8080
포트를 통해 웹 브라우저의 연결을 기다립니다. 웹 브라우저는http://[로봇_IP_주소]:8080
으로 접속하게 됩니다.
이러한 명시적인 host
와 port
설정 덕분에 별도의 추가 설정 없이도 같은 망 내에서는 통신이 잘 동작합니다.
요약
- 동일 망(네트워크) 요구: 예, 기본적으로 현재 코드는 웹 브라우저(사용자)와 로봇 장치(webserver.py, teleop_web_node.py)가 동일한 로컬 네트워크에 있어야 통신이 가능합니다. 이는 WebRTC의 시그널링 서버 및 ROS 2 DDS의 통신 특성 때문입니다.
- 특정 서버/포트 명시:
webserver.py
코드 내에서--host
는0.0.0.0
,--port
는8080
으로 명시적으로 설정되어 있습니다. 따라서 이 설정에 따라 웹 서버는 지정된 포트에서 모든 네트워크 인터페이스로부터의 연결을 수신 대기하며 잘 동작합니다.
만약 외부 네트워크에서 로봇을 제어하고자 한다면, 다음과 같은 추가적인 네트워크 설정이 필요합니다:
- STUN/TURN 서버 사용: WebRTC는 NAT 환경에서 통신을 가능하게 하기 위해 STUN(Session Traversal Utilities for NAT) 및 TURN(Traversal Using Relays around NAT) 서버를 사용합니다.
webserver.py
코드에 이러한 서버 설정을 추가해야 합니다. - 포트 포워딩 (Port Forwarding): 로봇이 있는 네트워크 라우터에서
8080
포트(또는 설정된 다른 포트)를 로봇의 내부 IP 주소로 포워딩해야 합니다. - 고정 IP 주소 또는 DDNS: 로봇의 IP 주소가 변경되지 않도록 고정 IP를 사용하거나, DDNS(Dynamic DNS) 서비스를 설정하여 도메인 이름으로 접속할 수 있도록 해야 합니다.