Skip to content

YUNCHANGHYEOK/RC_Project

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

32 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

WebRTC 기반 λΌμΈνŠΈλ ˆμ΄μ‹± μžμœ¨μ£Όν–‰ RCμΉ΄

License: MIT Python Arduino Raspberry Pi


πŸ“Œ ν”„λ‘œμ νŠΈ κ°œμš”

λ³Έ ν”„λ‘œμ νŠΈλŠ” Raspberry Pi 5, PiCamera2, 그리고 Arduino Unoλ₯Ό 기반으둜 ν•œ WebRTC μ‹€μ‹œκ°„ μ˜μƒ 슀트리밍 및 λΌμΈνŠΈλ ˆμ΄μ‹± μžμœ¨μ£Όν–‰ RCμΉ΄λ₯Ό κ΅¬ν˜„ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€.

  • PiCamera2κ°€ μΊ‘μ²˜ν•œ μ‹€μ‹œκ°„ μ˜μƒμ„ OpenCV둜 μ²˜λ¦¬ν•˜μ—¬ 라인을 μΈμ‹ν•˜κ³ , 쀑심 μ’Œν‘œλ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
  • ν•΄λ‹Ή μ’Œν‘œλŠ” μ‹œλ¦¬μ–Ό 톡신을 톡해 Arduino에 μ „λ‹¬λ˜λ©°, ArduinoλŠ” 이λ₯Ό λ°”νƒ•μœΌλ‘œ λͺ¨ν„°(ESC)와 μ„œλ³΄λ₯Ό μ •λ°€ν•˜κ²Œ μ œμ–΄ν•˜μ—¬ 선을 따라 μ£Όν–‰ν•©λ‹ˆλ‹€.
  • RC μ‘°μ’…κΈ°(CH1, CH2, CH6)λ₯Ό 톡해 μˆ˜λ™ μ œμ–΄ λ˜ν•œ κ°€λŠ₯ν•˜λ©°, CH6 μŠ€μœ„μΉ˜λ‘œ 자율/μˆ˜λ™ λͺ¨λ“œλ₯Ό μ „ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν–₯ν›„ 초음파 μ„Όμ„œ, LIDAR λ“± λ‹€μ–‘ν•œ ν™•μž₯을 κ³ λ €ν•œ λͺ¨λ“ˆν˜• 섀계가 μ μš©λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

πŸ§‘β€πŸ’» νŒ€ ꡬ성원

이름 μ—­ν•  및 κΈ°μ—¬ λ‚΄μš©
윀창혁 μ‹œμŠ€ν…œ 전체 섀계 및 톡합
PiCamera2 μ˜μƒμ²˜λ¦¬ μ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„
Arduino PWM μ œμ–΄ μ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„
μžμœ¨μ£Όν–‰ λͺ¨λ“œμ—μ„œμ˜ μ˜€ν”„μ…‹ 기반 μ‘°ν–₯ μ•Œκ³ λ¦¬μ¦˜ μ΅œμ ν™”
심창완 WebRTC μ„œλ²„ 및 μ›Ή μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„
라인 μ΄νƒˆ 볡원/λŒ€μ‘ μ•Œκ³ λ¦¬μ¦˜ 개발
μ‹€μ‹œκ°„ μ›Ήμ†ŒμΌ“ 톡신 섀계 및 μ—°κ²° μ•ˆμ •μ„± 확보
aiortc 기반 WebRTC μ„œλ²„ μ΅œμ ν™” 및 μ§€μ—° μ‹œκ°„ κ°μ†Œ μ „λž΅ 적용

πŸ—‚οΈ ν”„λ‘œμ νŠΈ 파일 ꡬ쑰

.         
β”œβ”€β”€ arduino/
β”‚   └── hybrid_manual_auto.ino       # μˆ˜λ™ 및 자율 μ£Όν–‰ 톡합 아두이노 μ½”λ“œ
β”œβ”€β”€ README.md                        # λ³Έ λ¬Έμ„œ
β”œβ”€β”€ LICENSE                          # μ˜€ν”ˆμ†ŒμŠ€ λΌμ΄μ„ μŠ€ (MIT)
└── WebRTC/
β”‚   β”œβ”€β”€ camera_stream_server.py      # python WebRTC μ„œλ²„ μ½”λ“œ
β”‚   └── index.html                   # WebRTC μ›Ή λ·°μ–΄ μ½”λ“œ
└── images/
    └── linetracking.png             # μ›Ή λ·°μ–΄ 이미지

βš™οΈ μ£Όμš” κΈ°λŠ₯ 및 μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜

πŸ”§ 전체 μ‹œμŠ€ν…œ 흐름도

[RC μ‘°μ’…κΈ° (CH1/CH2/CH6)]         [PiCamera2 + Raspberry Pi]
       β”‚                                 β”‚
       └─ PWM μž…λ ₯ ──┐              β”Œβ”€β”€β”€β”€β”˜
                    β–Ό              β–Ό
        [Arduino Uno]   ◀── Serial 톡신 ─── [Line Detection + Offset 계산]
          β”‚        β”‚                              β”‚
      Servo     ESC(PWM)                     (Python + OpenCV)
          β–Ό        β–Ό                              β”‚
       [RC Car] 자율/μˆ˜λ™ μ£Όν–‰                   β–Ό
                                          [πŸ“„ HTML λ·°μ–΄ (index.html)]
                                               β”‚
                                  λΈŒλΌμš°μ €μ—μ„œ WebRTC + WebSocket μˆ˜μ‹ 

πŸ“Œ 핡심 ꡬ성 μš”μ†Œ

  • PiCamera2 + Raspberry Pi: HSV 마슀크 기반 λΌμΈνŠΈλ ˆμ΄μ‹± 및 μ˜μƒ 슀트리밍
  • Arduino Uno: PWM μž…λ ₯ λ””μ½”λ”© 및 μ‹œλ¦¬μ–Ό μˆ˜μ‹  기반 μ„œλ³΄/ESC μ œμ–΄
  • WebRTC μ„œλ²„: aiortc, websockets 기반 μ‹€μ‹œκ°„ μ˜μƒ μ†‘μΆœ
  • LED ν”Όλ“œλ°±: μ‘°ν–₯ λ°©ν–₯ 및 속도 μƒνƒœλ₯Ό μ‹œκ°μ μœΌλ‘œ ν‘œμ‹œ

🧠 이미지 처리 및 μ œμ–΄ 둜직 (Python)

  • μž…λ ₯ 해상도: 640x480 (RGB888)
  • 처리 νŒŒμ΄ν”„λΌμΈ:
    1. HSV 색곡간 λ³€ν™˜
    2. 검은색 λ§ˆμŠ€ν‚Ή 및 Morphological Closing
    3. ROI1 (ν•˜λ‹¨) β†’ cv2.fitLine() 기반 쀑심 μ’Œν‘œ 계산
    4. ROI2 (상단) β†’ 보쑰 예츑 정보 μΆ”μΆœ
  • μ‹œλ¦¬μ–Ό 포맷: center_x,center_y\n
  • λ―Έκ²€μΆœ μ‹œ -1,-1\n 전솑, 100ms 이상 간격 μœ μ§€

πŸ€– Arduino μΈ‘ λ™μž‘ 둜직

β–Ά PWM μž…λ ₯ 처리

  • CH1: μ‘°ν–₯ (Steering)
  • CH2: 속도 (Throttle)
  • CH6: λͺ¨λ“œ μ „ν™˜

β–Ά 자율 μ£Όν–‰ λͺ¨λ“œ (CH6 > 1750)

  • μ‹œλ¦¬μ–Ό μˆ˜μ‹  쀑심 μ’Œν‘œ 기반 offset 계산
  • offset β†’ λΉ„μ„ ν˜• 보정(steerExpo) β†’ steerRange 반영
  • Y μ’Œν‘œμ— 따라 속도 μ „ν™˜ (cornerSpeed ↔ straightSpeed)
  • λ―Έκ²€μΆœ μ‹œ 곑선 ν›„μ§„ 둜직 μˆ˜ν–‰

β–Ά μˆ˜λ™ μ£Όν–‰ λͺ¨λ“œ (CH6 < 1750)

  • PWM 직접 λ””μ½”λ”© 및 steerExpo 보정
  • μ „ν›„μ§„ 속도 κ³„μˆ˜ 반영

β–Ά LED ν”Όλ“œλ°±

  • 쒌우 μ‘°ν–₯: 쒌/우 LED 점멸
  • ν›„μ§„ μ‹œ: μ–‘μͺ½ LED 점등

πŸ”„ Raspberry Pi ↔ Arduino Serial 톡신 ν”„λ‘œν† μ½œ

λ³Έ μ‹œμŠ€ν…œμ€ Raspberry Pi (Python) μ—μ„œ μ˜μƒ 처리된 λΌμΈνŠΈλ ˆμ΄μ‹± κ²°κ³Όλ₯Ό Arduino (C++) 둜 μ „μ†‘ν•˜μ—¬ μžμœ¨μ£Όν–‰ λ™μž‘μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

단방ν–₯ Serial 톡신(RPi β†’ Arduino) 기반으둜 κ΅¬ν˜„λ˜λ©°, 톡신 κ΅¬μ‘°λŠ” λ‹¨μˆœν•˜μ§€λ§Œ μ‹€μ‹œκ°„μ„±κ³Ό μ•ˆμ •μ„±μ„ λ™μ‹œμ— μ œκ³΅ν•©λ‹ˆλ‹€.


πŸ“¬ 톡신 ꡬ쑰

ν•­λͺ© μ„€λͺ…
톡신 λ°©ν–₯ Raspberry Pi β†’ Arduino (단방ν–₯)
톡신 속도 9600 bps
전솑 μ£ΌκΈ° μ΅œμ†Œ 100ms 이상
(버퍼 μ˜€λ²„ν”Œλ‘œ λ°©μ§€ λͺ©μ )
데이터 포맷 "center_x,center_y\n"
정상 μ˜ˆμ‹œ 320,410\n
λ―Έκ²€μΆœ μ˜ˆμ‹œ -1,-1\n
μ—λŸ¬ 처리 100ms 이상 μˆ˜μ‹  μ—†μŒ λ˜λŠ” -1,-1 μˆ˜μ‹  μ‹œ 감지 μ‹€νŒ¨λ‘œ κ°„μ£Ό

πŸ“€ Raspberry Pi μΈ‘ (Python) β€” 솑신 μ½”λ“œ

# 쀑심 μ’Œν‘œκ°€ κ°μ§€λ˜μ—ˆμ„ 경우
serial.write(f"{cx},{cy}\n".encode())

# 라인을 μ°Ύμ§€ λͺ»ν–ˆμ„ 경우
serial.write("-1,-1\n".encode())
  • cx, cy: 라인 쀑심 μ’Œν‘œ (μ •μˆ˜ν˜•)
  • \n: 각 ν”„λ ˆμž„μ˜ μ’…λ£Œλ₯Ό λ‚˜νƒ€λ‚΄λŠ” 쒅단 문자
  • 전솑 간격: μ΅œμ†Œ 100ms 이상

πŸ“₯ Arduino μΈ‘ (C++) β€” μˆ˜μ‹  μ½”λ“œ

while (Serial.available()) {
  char c = Serial.read();
  if (c == '\n') {
    int commaIndex = serialBuffer.indexOf(',');
    if (commaIndex > 0) {
      lineCenter = serialBuffer.substring(0, commaIndex).toInt();
      lineY = serialBuffer.substring(commaIndex + 1).toInt();
      lastSerialTime = millis();
      lostLineCount = 0;
    }
    serialBuffer = "";
  } else {
    serialBuffer += c;
  }
}

πŸ” 처리 방식

  • 문자 λ‹¨μœ„λ‘œ 읽기 β†’ \n μˆ˜μ‹  μ‹œ νŒ¨ν‚· μ™„μ„±
  • ,λ₯Ό κΈ°μ€€μœΌλ‘œ μ’Œν‘œ 뢄리 β†’ toInt()둜 λ³€ν™˜
  • 정상 μ’Œν‘œ μˆ˜μ‹  μ‹œ lastSerialTime μ΄ˆκΈ°ν™” 및 둜직 μ‹€ν–‰
  • 비정상 λ˜λŠ” λˆ„λ½ μ‹œ 감지 μ‹€νŒ¨ 처리

⚠️ μˆ˜μ‹  νƒ€μž„μ•„μ›ƒ 및 μ˜ˆμ™Έ 처리

if (millis() - lastSerialTime > serialFrameTimeout) {
  if (lostLineCount < lostLineThreshold) {
    lostLineCount++;
    lastSerialTime = millis();
  }
  if (lostLineCount >= lostLineThreshold) {
    lineCenter = -1;
    lineY = -1; // 감지 μ‹€νŒ¨λ‘œ κ°„μ£Ό
  }
}
  • 일정 μ‹œκ°„ μˆ˜μ‹  μ—†μŒ μ‹œ: lostLineCount 증가
  • 연속 μ‹€νŒ¨(lostLineThreshold 초과) β†’ -1,-1둜 κ°•μ œ 처리
  • 이 μƒνƒœμ—μ„œλŠ” ν›„μ§„ λ˜λŠ” νšŒν”Ό λ“± μ•ˆμ „ 둜직 μ‹€ν–‰ κ°€λŠ₯

βœ… μš”μ•½

ν•­λͺ© λ‚΄μš©
전솑 포맷 "center_x,center_y\n" (UTF-8 인코딩)
전솑 μ£ΌκΈ° 100ms 이상
μˆ˜μ‹  방식 문자 λ‹¨μœ„ νŒŒμ‹±, μ’…λ‹¨λ¬Έμž \n κΈ°μ€€
μ—λŸ¬ 처리 -1,-1 전솑 λ˜λŠ” timeout λ°œμƒ μ‹œ 감지 μ‹€νŒ¨ κ°„μ£Ό

πŸ’» μ„€μΉ˜λ°©λ²•

🐍 Python WebRTC μ„œλ²„ (Raspberry Pi 5)

  1. ν”„λ‘œμ νŠΈ 클둠

    git clone https://github.com/YUNCHANGHYEOK/RC_Project.git
    cd RC_Project
  2. κ°€μƒν™˜κ²½ 생성 및 ν™œμ„±ν™”

    κ°€μƒν™˜κ²½ 생성 및 ν™œμ„±ν™”
    python3 -m venv venv
    source venv/bin/activate  # Windows의 경우: venv\\Scripts\\activate
  3. ν•„μš”ν•œ νŒ¨ν‚€μ§€ μ„€μΉ˜

    pip install opencv-python aiortc websockets picamera2 numpy

▢️ μ‹€ν–‰ 방법

  1. WebRTC μ˜μƒ 처리 μ„œλ²„ μ‹€ν–‰

    source venv/bin/activate            # κ°€μƒν™˜κ²½ ν™œμ„±ν™”
    python camera_stream_server.py     # λΌμΈνŠΈλ ˆμ΄μ‹± + WebRTC μ„œλ²„ μ‹€ν–‰
    • Picamera2둜 라인을 μΈμ‹ν•˜κ³ 
    • 라인의 μ€‘μ‹¬μ’Œν‘œλ₯Ό μ•„λ‘μ΄λ…Έλ‘œ 전솑
    • WebRTC + WebSocket을 톡해 λΈŒλΌμš°μ €λ‘œ μ˜μƒ 슀트리밍
  2. ν΄λΌμ΄μ–ΈνŠΈ HTML λ·°μ–΄ μ‹€ν–‰

    • λ‹€λ₯Έ ν„°λ―Έλ„μ—μ„œ λ™μΌν•œ κ°€μƒν™˜κ²½μ„ ν™œμ„±ν™”ν•œ ν›„, HTML 파일이 μžˆλŠ” λ””λ ‰ν† λ¦¬μ—μ„œ μ•„λž˜ λͺ…λ Ήμ–΄ μ‹€ν–‰:
    source venv/bin/activate            # κ°€μƒν™˜κ²½ ν™œμ„±ν™”
    cd html/                            # (예: HTML 파일이 html 폴더에 μžˆλ‹€λ©΄)
    python -m http.server 8000         # μ›Ήμ„œλ²„ μ‹€ν–‰
    • HTML 내뢀에 ν¬ν•¨λœ JavaScriptκ°€ WebSocket (8765)을 톡해 라인 쀑심 μ’Œν‘œμ™€ μ˜μƒμ„ μˆ˜μ‹ 

🧠 μ£Όμš” 둜직 μ„€λͺ… (Python μ½”λ“œ) + 사진

πŸ“Œ 초기 버전듀

초기 버전 1 초기 버전 2 초기 버전 3
UI1 UI2 UI3

βœ… μ΅œμ’… 버전

μ΅œμ’… 버전
μ΅œμ’…λ²„μ „

μ„€λͺ…

  • μ΄λ―Έμ§€μ—λŠ” 두 개의 μ΄ˆλ‘μƒ‰ μ‚¬κ°ν˜•μ΄ 보이며, μ΄λŠ” 각각 ROI1 (ν•˜λ‹¨)κ³Ό ROI2 (쀑간 상단)으둜 μ„  좔적을 μœ„ν•œ 뢄석 κ΅¬κ°„μž…λ‹ˆλ‹€.
  • λ…Έλž€ 점은 ROI1 λ‚΄μ—μ„œ κ²€μ • μ„ μ˜ 쀑심을 κ³„μ‚°ν•œ μ’Œν‘œλ‘œ, μ°¨λŸ‰ μ œμ–΄μ— ν™œμš©λ©λ‹ˆλ‹€.
  • λΉ¨κ°„ 점은 ROI2 λ‚΄ μ€‘μ‹¬μœΌλ‘œ, 주둜 μ„ μ˜ μ§„ν–‰ λ°©ν–₯ μ˜ˆμΈ‘μ΄λ‚˜ μ‘°ν–₯ νŒλ‹¨μ— μ°Έκ³ λ©λ‹ˆλ‹€.
  • 각 ROI의 ν”½μ…€ 데이터λ₯Ό 기반으둜 직선을 μΆ”μ •ν•˜κ³ , 쀑심 μ’Œν‘œλ₯Ό 아두이노 및 WebSocket으둜 μ „μ†‘ν•˜μ—¬ μ œμ–΄ μ‹œμŠ€ν…œκ³Ό μ—°λ™λ©λ‹ˆλ‹€.
  1. 🎯 HSV 마슀크 기반 라인 κ²€μΆœ

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    
    lower_black = np.array([0, 0, 0])
    upper_black = np.array([180, 90, 170])
    mask = cv2.inRange(hsv, lower_black, upper_black)
    • 카메라 μ˜μƒμ—μ„œ μ–΄λ‘μš΄(검정색) 선을 μΈμ‹ν•˜κΈ° μœ„ν•΄ BGR 이미지λ₯Ό HSV둜 λ³€ν™˜ν•œ ν›„, νŠΉμ • λ²”μœ„μ— ν•΄λ‹Ήν•˜λŠ” ν”½μ…€λ§Œ ν°μƒ‰μœΌλ‘œ λ§ˆμŠ€ν‚Ή
  2. 🟩 ROI1μ—μ„œ 쀑심 μ’Œν‘œ 계산(라인 좔적)

    roi = mask[320:400, :]  # ν•˜λ‹¨ μ˜μ—­ μž˜λΌλ‚΄κΈ°
    ys, xs = np.where(roi == 255)
    
    if len(xs) > 100:
        points = np.array(list(zip(xs, ys)))
        [vx, vy, x0, y0] = cv2.fitLine(points, cv2.DIST_L2, 0, 0.01, 0.01)
        t = ((400 - 320) // 2 - y0) / vy
        cx = int(x0 + vx * t)
    • μ˜μƒ ν•˜λ‹¨ μ˜μ—­(ROI1)μ—μ„œ 흰색 ν”½μ…€ μœ„μΉ˜λ₯Ό μˆ˜μ§‘ν•œ λ’€, 직선을 ν”ΌνŒ…ν•˜μ—¬ 라인의 μ€‘μ‹¬μ’Œν‘œλ₯Ό 계산
    • 이 값은 RC카의 μ£Όν–‰ 쀑심에 ν™œμš©
  3. πŸ” 이전 쀑심 μœ μ§€ 둜직(라인 미탐지 λŒ€λΉ„)

    if len(xs) <= 100:
        lost_counter += 1
        if last_valid_center and lost_counter < 10:
            center_x, center_y = last_valid_center
        else:
            center_x = center_y = None
    • 라인이 μΌμ‹œμ μœΌλ‘œ κ°μ§€λ˜μ§€ μ•Šλ”λΌλ„, 졜근 νƒμ§€λœ μ’Œν‘œλ₯Ό 일정 ν”„λ ˆμž„ λ™μ•ˆ μœ μ§€μ‹œμΌœ RCμΉ΄κ°€ λΆ€λ“œλŸ½κ²Œ μ£Όν–‰ν•˜λ„λ‘ 함
  4. πŸ”Œ μ•„λ‘μ΄λ…Έλ‘œ μ’Œν‘œ 전솑

    if center_x is not None:
        arduino.write(f\"{center_x},{center_y}\\n\".encode())
        response = arduino.readline().decode().strip()
    • κ°μ§€ν•œ 쀑심 μ’Œν‘œλ₯Ό μ•„λ‘μ΄λ…Έλ‘œ μ‹œλ¦¬μ–Ό 톡신을 톡해 전솑
    • RC카의 μ‘°ν–₯ 및 ESC μ œμ–΄λŠ” 이 값을 기반으둜 처리됨
  5. πŸ“‘ WebRTCλ₯Ό ν†΅ν•œ μ˜μƒ 슀트리밍

    video_frame = VideoFrame.from_ndarray(color_frame, format=\"bgr24\")
    video_frame.pts = pts
    return video_frame
    • 처리된 ν”„λ ˆμž„μ„ WebRTC용 λΉ„λ””μ˜€ ν”„λ ˆμž„ 객체둜 λ³€ν™˜ν•œ λ’€, λΈŒλΌμš°μ €λ‘œ 전솑
    • λΈŒλΌμš°μ €μ—μ„œλŠ” μ‹€μ‹œκ°„μœΌλ‘œ 라인 κ²€μΆœ μƒνƒœ 확인 κ°€λŠ₯

πŸ”§ Arduino μ½”λ“œ μ—…λ‘œλ“œ (Arduino Uno)

  1. Arduino IDE μ„€μΉ˜

  2. 라이브러리 μ„€μΉ˜

    • PinChangeInterrupt (μŠ€μΌ€μΉ˜ > 라이브러리 κ΄€λ¦¬μ—μ„œ μ„€μΉ˜)
  3. μ—…λ‘œλ“œ 절차

    • hybrid_manual_auto.ino μ—΄κΈ°
    • λ³΄λ“œ: Arduino Uno / 포트 μ„€μ •
    • 컴파일 ν›„ μ—…λ‘œλ“œ

⚠️ μ—…λ‘œλ“œ μ „ Serial Monitor μ’…λ£Œ ν•„μˆ˜

πŸ–ΌοΈ μ‹œκ° 자료 μ˜ˆμ‹œ, πŸ“Ί Youtube μ‹œμ—° μ˜μƒ (사진을 ν΄λ¦­ν•˜λ©΄ μ˜μƒ μž¬μƒ)

  • 라인 인식 μ˜ˆμ‹œ
πŸš— 일직선 μžμœ¨μ£Όν–‰
πŸ§ͺ μ‹œλ²” μžμœ¨μ£Όν–‰
βœ… μ‹€μ œ κ΅¬ν˜„ μ™„λ£Œλœ μžμœ¨μ£Όν–‰

πŸ“š 기술 μŠ€νƒ μš”μ•½

ν•˜λ“œμ›¨μ–΄

  • Raspberry Pi 5
  • PiCamera2
  • Arduino Uno
  • RC μˆ˜μ‹ κΈ° + μ‘°μ’…κΈ°
  • μ„œλ³΄ λͺ¨ν„°, ESC

μ†Œν”„νŠΈμ›¨μ–΄

  • Python 3.9+
  • OpenCV, aiortc, websockets
  • Arduino IDE 1.8+

🚧 ν–₯ν›„ κ°œμ„  λ°©ν–₯

  • PID μ‘°ν–₯ μ œμ–΄: 곑선 μ£Όν–‰ μ„±λŠ₯ ν–₯상 (μ‹€μ œ μ£Όν–‰λ•Œ ν•œλ²ˆ νŠΈλž™μ—μ„œ 벗어났닀 λŒμ•„μ˜€λŠ” ν˜„μƒ λ°œμƒ -> 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 쑰절)
  • μ‹€μ‹œκ°„ Web UI: λΈŒλΌμš°μ € μƒμ—μ„œ μ£Όν–‰ 정보 확인 및 μˆ˜λ™ μ‘°μž‘ κΈ°λŠ₯
  • μ μ‘ν˜• 라인 색상 감지: HSV λ²”μœ„ μžλ™ μ‘°μ • κΈ°λŠ₯ μΆ”κ°€ (λΉ›λ²ˆμ§μ—λ„ 라인을 잘 디텍싱할 수 μžˆλ„λ‘ 쑰절)
  • 닀쀑 ROI 보정: μ„  λ‹¨μ ˆ ꡬ간 예츑 λŒ€μ‘ ν–₯상
  • μ„Όμ„œ 톡합 ν™•μž₯: 초음파, LIDAR λ“± μ™ΈλΆ€ μ„Όμ„œ 연동 (μ•žμ— μž₯애물이 μžˆλ‹€λ©΄ 이λ₯Ό μΈμ‹ν•˜κ³  μ‘°μ ˆν•  수 μžˆλ„λ‘ λ°œμ „)
  • μ„±λŠ₯ μ΅œμ ν™” 및 속도 증가: μžμ›μ˜ 효율 κ°œμ„ (속도λ₯Ό λ”μš± λŠ˜λ €μ„œ λΉ λ₯Έ 주행이 κ°€λŠ₯ν•˜λ„λ‘ 쑰절)

πŸš— WebRTC 기반 λΌμΈνŠΈλ ˆμ΄μ‹± μžμœ¨μ£Όν–‰ RCμΉ΄ ν”„λ‘œμ νŠΈ λŠλ‚€μ 

이번 WebRTC 기반 λΌμΈνŠΈλ ˆμ΄μ‹± μžμœ¨μ£Όν–‰ RCμΉ΄ ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ λ‹€μ–‘ν•œ 기술적 도전과 μ„±μž₯을 κ²½ν—˜ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
특히 ν•˜λ“œμ›¨μ–΄μ™€ μ†Œν”„νŠΈμ›¨μ–΄κ°€ 유기적으둜 κ²°ν•©λœ μ‹œμŠ€ν…œμ„ μ„€κ³„ν•˜κ³  κ΅¬ν˜„ν•˜λŠ” κ³Όμ •μ—μ„œ λ§Žμ€ 것을 λ°°μ› μŠ΅λ‹ˆλ‹€.

πŸ§‘β€πŸ’» 윀창혁

μ €λŠ” μ‹œμŠ€ν…œ 전체 섀계 및 톡합, 그리고 PiCamera2 μ˜μƒμ²˜λ¦¬ μ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„μ— μ§‘μ€‘ν–ˆμŠ΅λ‹ˆλ‹€.
특히 λΌμΈνŠΈλ ˆμ΄μ‹± μ‹œ μ˜€ν”„μ…‹ 기반 μ‘°ν–₯ μ•Œκ³ λ¦¬μ¦˜μ„ μ΅œμ ν™”ν•˜λŠ” κ³Όμ •μ—μ„œ λ§Žμ€ μ‹œν–‰μ°©μ˜€λ₯Ό κ²ͺμ—ˆμ§€λ§Œ,
λŠμž„μ—†λŠ” ν…ŒμŠ€νŠΈμ™€ 디버깅을 톡해 RCμΉ΄κ°€ μ•ˆμ •μ μœΌλ‘œ 라인을 따라 μ£Όν–‰ν•˜λŠ” λͺ¨μŠ΅μ„ 보며 큰 λ³΄λžŒμ„ λŠκΌˆμŠ΅λ‹ˆλ‹€.

μ‹€μ œλ‘œ ν•˜λ£¨ 쒅일 μ½”λ“œλ₯Ό μˆ˜μ •ν•˜λ©΄μ„œ, ν”„λ‘œκ·Έλž˜λ¨Έμ—κ²Œ μžˆμ–΄ 개발뿐만 μ•„λ‹ˆλΌ ν…ŒμŠ€νŠΈμ™€ 디버깅 과정이 μ–Όλ§ˆλ‚˜ μ€‘μš”ν•œμ§€λ₯Ό 깊이 κΉ¨λ‹¬μ•˜μŠ΅λ‹ˆλ‹€.
이 과정은 λ‹¨μˆœν•œ κΈ°λŠ₯ κ΅¬ν˜„μ„ λ„˜μ–΄μ„œ, ν•˜λ“œμ›¨μ–΄μ™€ μ†Œν”„νŠΈμ›¨μ–΄ κ°„μ˜ μ„¬μ„Έν•œ μΈν„°νŽ˜μ΄μŠ€ 섀계가 ν”„λ‘œμ νŠΈμ˜ 완성도에 큰 영ν–₯을 λ―ΈμΉœλ‹€λŠ” 것을 μ•Œκ²Œ ν•΄μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ 이번 ν”„λ‘œμ νŠΈλ₯Ό 톡해, 기술적인 κ΅¬ν˜„λ§ŒνΌμ΄λ‚˜ README λ¬Έμ„œ μž‘μ„±κ³Ό 기둝 μ •λ¦¬μ˜ μ€‘μš”μ„±λ„ μƒˆλ‘­κ²Œ 싀감할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
λͺ…ν™•ν•œ λ¬Έμ„œν™”λŠ” μœ μ§€λ³΄μˆ˜λ‚˜ ν˜‘μ—…μ— ν•„μˆ˜μ μ΄λ©°, ν”„λ‘œμ νŠΈλ₯Ό λ”μš± κ°€μΉ˜ 있게 λ§Œλ“œλŠ” 핡심 μš”μ†Œμž„μ„ λ‹€μ‹œκΈˆ κΉ¨λ‹«λŠ” 계기가 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

πŸ§‘β€πŸ’» 심창완

WebRTC μ„œλ²„μ™€ μ›Ή μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„μ„ λ‹΄λ‹Ήν•˜λ©°,
μ‹€μ‹œκ°„ μ˜μƒ 슀트리밍의 λ³΅μž‘μ„±κ³Ό μ›Ήμ†ŒμΌ“ ν†΅μ‹ μ˜ μ•ˆμ •μ„± 확보에 λŒ€ν•΄ 깊이 있게 이해할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

특히 aiortc 기반의 WebRTC μ„œλ²„λ₯Ό μ΅œμ ν™”ν•˜μ—¬ μ§€μ—° μ‹œκ°„μ„ μ΅œμ†Œν™”ν•˜λŠ” 과정은 λ„μ „μ μ΄μ—ˆμ§€λ§Œ,
μ‚¬μš©μžμ—κ²Œ λŠκΉ€ μ—†λŠ” μ‹€μ‹œκ°„ μ˜μƒμ„ μ œκ³΅ν•  수 있게 λ˜μ–΄ λΏŒλ“―ν•©λ‹ˆλ‹€.

λ˜ν•œ 라인 μ΄νƒˆ μ‹œ 볡원/λŒ€μ‘ μ•Œκ³ λ¦¬μ¦˜μ„ κ°œλ°œν•˜λ©΄μ„œ
예츑 λΆˆκ°€λŠ₯ν•œ 상황에 λŒ€ν•œ μ‹œμŠ€ν…œμ˜ 견고성을 λ†’μ΄λŠ” 데 κΈ°μ—¬ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

🀝 νŒ€μ›Œν¬μ™€ 배움

이번 ν”„λ‘œμ νŠΈλ₯Ό 톡해 νŒ€μ›λ“€κ³Όμ˜ κΈ΄λ°€ν•œ ν˜‘μ—…μ˜ μ€‘μš”μ„±μ„ λ‹€μ‹œ ν•œλ²ˆ λŠκΌˆμŠ΅λ‹ˆλ‹€.
각자의 역할에 μ΅œμ„ μ„ λ‹€ν•˜λ©΄μ„œλ„ μ„œλ‘œμ˜ 어렀움을 ν•¨κ»˜ κ³ λ―Όν•˜κ³  ν•΄κ²°ν•΄ λ‚˜κ°€λŠ” 과정이 μžˆμ—ˆκΈ°μ—
μ„±κ³΅μ μœΌλ‘œ ν”„λ‘œμ νŠΈλ₯Ό λ§ˆλ¬΄λ¦¬ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

μ•žμœΌλ‘œλ„ μ΄λŸ¬ν•œ κ²½ν—˜μ„ λ°”νƒ•μœΌλ‘œ λ”μš± λ³΅μž‘ν•˜κ³  ν₯미둜운 ν”„λ‘œμ νŠΈμ— λ„μ „ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.


πŸ“œ λΌμ΄μ„ μŠ€

MIT License β€” LICENSE 파일 μ°Έμ‘°

About

No description, website, or topics provided.

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors