같은 망에서 사용하는가 - dingdongdengdong/astra_ws GitHub Wiki

현재 코드의 통신 방식 및 망(네트워크) 조건

제공된 코드 (webserver.pyteleop_web_node.py)를 분석했을 때, 이 시스템은 로컬 네트워크 또는 동일한 장치 내에서의 통신을 기본으로 설계되었습니다. 이는 주로 WebRTC와 ROS 2의 통신 특성 때문입니다.

  1. WebRTC (웹 브라우저 ↔ WebServer):

    • webserver.pyaiohttp.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를 통해 이루어지므로, 안정적인 스트리밍을 위해서는 낮은 지연 시간과 충분한 대역폭을 가진 네트워크 환경이 중요합니다.
  2. 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으로 접속하게 됩니다.

이러한 명시적인 hostport 설정 덕분에 별도의 추가 설정 없이도 같은 망 내에서는 통신이 잘 동작합니다.

요약

  • 동일 망(네트워크) 요구: 예, 기본적으로 현재 코드는 웹 브라우저(사용자)와 로봇 장치(webserver.py, teleop_web_node.py)가 동일한 로컬 네트워크에 있어야 통신이 가능합니다. 이는 WebRTC의 시그널링 서버 및 ROS 2 DDS의 통신 특성 때문입니다.
  • 특정 서버/포트 명시: webserver.py 코드 내에서 --host0.0.0.0, --port8080으로 명시적으로 설정되어 있습니다. 따라서 이 설정에 따라 웹 서버는 지정된 포트에서 모든 네트워크 인터페이스로부터의 연결을 수신 대기하며 잘 동작합니다.

만약 외부 네트워크에서 로봇을 제어하고자 한다면, 다음과 같은 추가적인 네트워크 설정이 필요합니다:

  • 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) 서비스를 설정하여 도메인 이름으로 접속할 수 있도록 해야 합니다.