Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

  • IC Timer 555 yang Multifungsi

    IC timer 555 adalah sirkuit terpadu (chip) yang digunakan dalam berbagai pembangkit timer, pulsa dan aplikasi osilator. Komponen ini digunakan secara luas, berkat kemudahan dalam penggunaan, harga rendah dan stabilitas yang baik

  • Data Science

    Mengulik Digitalisasi data statistik dengan bantuan python untuk pemanfaatan di bidang transportasi, kesehatan, keuangan dan masih banyak lagi

  • Artificial Intelligence - Pengenalan Object

    Menghadirkan pemanfaatan AI dengan praktek-praktek yang mudah diikuti - cocok untuk mahasiswa yang mencari ide tugas akhir

  • JAM DIGITAL 6 DIGIT TANPA MICRO FULL CMOS

    Jika anda pencinta IC TTL datau CMOS maka project jam digital ini akan menunjukkan bahwa tidak ada salahnya balik kembali ke dasar elektronika digital , sebab semuanya BISA dibuat dengan teknologi jadul

  • Node Red - Kontrol Industri 4.0

    Teknologi kontrol sudah melampaui ekspektasi semua orang dan dengan kemajuan dunia elektronika, kini semakin leluasa berkreasi melalui Node Red

Tampilkan postingan dengan label python. Tampilkan semua postingan
Tampilkan postingan dengan label python. Tampilkan semua postingan

Sabtu, 28 Juni 2025

AGV - Tahap 1 : Membuat Mobil RC Mengikuti Pergerakan Kode ArUco

 


Dalam beberapa tahun terakhir, perkembangan teknologi otomasi di berbagai sektor industri semakin pesat. Salah satu inovasi yang mulai banyak diterapkan adalah penggunaan Autonomous Guided Vehicle atau AGV. Kendaraan tanpa awak ini hadir sebagai solusi cerdas untuk memindahkan barang secara otomatis dengan efisiensi tinggi dan minim intervensi manusia.

AGV bukan sekadar mobil robot yang bisa bergerak sendiri — ia merupakan bagian penting dari transformasi digital di bidang logistik, manufaktur, hingga gudang penyimpanan. Dengan kemampuan navigasi mandiri menggunakan sensor, laser, atau sistem visi komputer, AGV mampu menggantikan proses manual yang sebelumnya memakan banyak waktu dan tenaga kerja.

Kehadiran AGV juga semakin relevan di tengah tuntutan industri akan produktivitas, akurasi, serta keamanan kerja yang lebih baik. Selain itu, dengan adanya pandemi beberapa tahun belakangan, banyak perusahaan mulai beralih ke sistem otomatis untuk mengurangi ketergantungan pada tenaga kerja langsung — dan AGV menjadi salah satu jawaban utama.


Setelah saya berhasil mengubah mobil RC 27mhz menjadi ber - WiFi ( baca disini ), maka langkah awal yang saya lakukan untuk menjadikannya bisa mengikuti rute terpendek seperti gambar animasi diatas adalah dengan membuat marking kode di tiap koordinatnya menggunakan kode AruCo. Untuk itu saya menambahkan kamera CCTV IP diatas mobil-mobilan remote yang saya sudah modifikasi.



Saya pilihkan IP CCTV merek Ezviz H1C yang paling cocok karena bisa digunakan dalam mode offline (tanpa butuh internet), dibanding awalnya saya menggunakan merek bardi yang sejenis namun harus terhubung internet baru bisa di akses RTSP streamnya. Untuk mengakses stream CCTV ezviz cukup butuh password securitynya (6 buah huruf) yang biasanya terdapat di bawah dudukan kameranya (atau bisa diubah lewat aplikasi ezviz) serta IP yang didapatnya. Contoh nya alamat seperti ini :


rtsp://admin:XXXXXX@192.168.1.178:554/Streaming/Channels/101


Alamat paling belakang merupakan mode resolusi dimana 101 = HD 1080 dan jika 102 ber resolusi SD 480.



Logika yang saya gunakan untuk percobaan kali ini sebagai berikut :

1. CCTV ip diakses stream nya oleh python-opencv dan kemudian mencari  kode ArUco pada frame yang ditangkap yang sudah ditentukan kode ID nya

2. Layar gambar dibagi menjadi 3 bagian yaitu kanan tengah dan kiri. Apabila kodenya terdapat ditengah maka akan mengirmkan perintah maju ke RC melalui pengiriman pesan UDP, begitu pula untuk kanan dan kiri. 

3. Mobil RC kemudian akan bergerak sesuai dengan animasi paling atas tulisan ini. Jika tidak ada kode yang terdeteksi selama 10 detik maka mobil akan mundur untuk mencari kemungkinan kode terlewati

4. Langkah selanjutnya akan di desain pendeteksi urutan gerak RC sesuai ID marker yang sudah disusun berdasarkan rute terpendek






Koding pythonnya seperti berikut :



import cv2
import socket
import time

# Konfigurasi UDP sesuaikan dengan koding mobil RC wifi
UDP_IP = "192.168.1.177"
UDP_PORT = 4210
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

def send_udp(data):
    sock.sendto(data.encode(), (UDP_IP, UDP_PORT))
    print(f"[UDP] Terkirim: {data}")

# URL RTSP dari kamera IP
rtsp_url = "rtsp://admin:XXXXXX@192.168.1.178:554/Streaming/Channels/102"

# Inisialisasi detector ArUco
aruco_dict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_APRILTAG_36H11)
parameters = cv2.aruco.DetectorParameters()
detector = cv2.aruco.ArucoDetector(aruco_dict, parameters)

target_id = 32
last_send_time = time.time()
last_detection_time = time.time()  # Untuk hitung mundur mundur
send_data = "0"
action_text = "Tidak Ada Deteksi"
has_sent_stop = False  # Hanya kirim "2" sekali per siklus

# Fungsi untuk menulis teks dan kotak
def draw_overlay(frame, text):
    font = cv2.FONT_HERSHEY_SIMPLEX
    cv2.putText(frame, f"Aksi: {text}", (10, 60), font, 1, (0, 255, 255), 2, cv2.LINE_AA)

cap = cv2.VideoCapture(rtsp_url)

while True:
    ret, frame = cap.read()
    if not ret:
        print("Tidak dapat menerima frame. Keluar...")
        break

    current_time = time.time()
    detected = False

    # --- DETEKSI APRILTAG ---
    corners, ids, rejected = detector.detectMarkers(frame)

    if ids is not None:
        for i in range(len(ids)):
            if ids[i][0] == target_id:
                corner = corners[i][0]

                # Gambar kotak di sekitar tag
                cv2.polylines(frame, [corner.astype(int)], True, (0, 255, 0), 2)

                # Hitung titik tengah
                cX = int((corner[0][0] + corner[2][0]) / 2)
                width = frame.shape[1]
                zona_kiri = width // 3
                zona_tengah = 2 * width // 3

                # Tentukan zona dan aksi
                if cX < zona_kiri:
                    action_text = "Kiri"
                    send_data = "3"
                elif cX < zona_tengah:
                    action_text = "Maju"
                    send_data = "1"
                else:
                    action_text = "Kanan"
                    send_data = "4"

                # Reset timer mundur
                last_detection_time = current_time
                has_sent_stop = False
                detected = True

                # Titik tengah
                cY = int((corner[0][1] + corner[2][1]) / 2)
                cv2.circle(frame, (cX, cY), 5, (0, 0, 255), -1)

                # Garis pembatas zona
                cv2.line(frame, (zona_kiri, 0), (zona_kiri, frame.shape[0]), (255, 0, 0), 1)
                cv2.line(frame, (zona_tengah, 0), (zona_tengah, frame.shape[0]), (255, 0, 0), 1)
                break

    # --- LOGIKA TIMER MUNDUR ---
    if not detected:
        elapsed_no_detection = current_time - last_detection_time
        if elapsed_no_detection >= 10 and not has_sent_stop:
            send_data = "2"
            action_text = "Mundur"
            send_udp(send_data)
            print("[INFO] Mengirim '2' (mundur)")
            has_sent_stop = True  # Tandai bahwa sudah dikirim
        else:
            action_text = "Tidak Ada Deteksi"
            send_data = "0"
    else:
        last_detection_time = current_time  # Reset timer jika ada deteksi
        has_sent_stop = False  # Reset agar bisa kirim ulang "2" di masa depan

    # --- KIRIM DATA SETIAP 2 DETIK ---
    if current_time - last_send_time >= 2:
        send_udp(send_data)
        last_send_time = current_time

    # --- TAMPILKAN DI LAYAR ---
    draw_overlay(frame, action_text)
    cv2.imshow('AprilTag Detection', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# --- BERSIHKAN ---
cap.release()
cv2.destroyAllWindows()





SELAMAT MENCOBA !




Share:

Jumat, 27 Juni 2025

Pengenalan ARUCO - APRIL TAG sebagai deteksi marker yang cepat

 


Menepati janji saya beberapa bulan yang lalu dimana saya akan membagi hasil proyek bersama profesor atletik di unesa, maka beberapa episode tulisan saya akan membahas mengenai pemanfaatan pendeteksi marker yang bernama Aruco-AprilTag. Gambar animasi diatas terlihat mahasiswa yang berlari menggunakan topi lucu dengan code kotak disamping. Apakah itu ?

Dalam dunia computer vision, kemampuan untuk mendeteksi dan melokalisasi objek secara akurat merupakan hal yang sangat penting, terutama dalam aplikasi robotika, augmented reality, drone, dan sistem navigasi otomatis. Salah satu teknologi yang populer digunakan untuk kebutuhan ini adalah ArUco dan AprilTag — dua jenis penanda (fiducial marker) yang memungkinkan mesin mengenali posisi dan orientasi suatu objek dengan presisi tinggi dan latensi rendah.

Meskipun memiliki tujuan serupa, kedua teknologi ini memiliki perbedaan mendasar dalam pendekatan algoritma, struktur marker, serta performa deteksi. Dalam artikel ini, kita akan menjelajahi bagaimana kedua sistem bekerja, lalu fokus pada implementasi penggunaannya menggunakan Python dan OpenCV, lengkap dengan contoh kode sederhana yang bisa langsung Anda coba sendiri.

Apakah Anda seorang penggemar robotika, developer AR/VR, atau sekadar tertarik dengan teknologi visi komputer? Artikel ini akan memberikan dasar yang kuat untuk memahami dan mulai memanfaatkan ArUco dan AprilTag dalam proyek-proyek Anda berikutnya.



Perhatikan gambar diatas yang saya generate melalui website ( https://chev.me/arucogen/) untuk mencetak gambar aruco DICT 5x5. Kita ubah menjadi kotak hitam dan putih dan binarynya seperti berikut:


[0, 1, 1, 1, 0]

[1, 0, 0, 0, 1]

[1, 0, 1, 0, 1]

[1, 0, 0, 0, 1]

[0, 1, 1, 1, 0]


Langkah konversi:

1. Flattening matriks : semua baris disusun menjadi satu dimensi.

misal: [1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1]

2. Menghitung nilai hash/biner unik : ini dilakukan oleh library OpenCV secara internal menggunakan algoritma tertentu (tergantung dictionary).

3. Pencarian ID : Hash tersebut dibandingkan dengan semua marker yang ada di dictionary untuk menemukan ID uniknya.

Misalnya, jika cocok dengan marker ID 23 dalam dictionary, maka sistem akan mengembalikan nilai id = 23. 


🔄 Visualisasi Proses (secara logis):


Gambar Asli → Thresholding → Crop & Warp → Matriks Biner → Flattening → Hash/ID → Cocokkan dengan Dictionary → Dapatkan ID Marker

💡 Catatan Penting:

  • Tidak semua pola biner bisa jadi ID valid — hanya pola-pola yang sudah ditentukan dalam dictionary ArUco yang dikenali.
  • Jika pola tidak cocok, sistem akan mengabaikannya atau menandainya sebagai marker tidak dikenal.
  • AprilTag bekerja dengan prinsip serupa, tapi menggunakan pendekatan deteksi dan encoding yang sedikit berbeda (lebih toleran terhadap noise dan rotasi).

Kita langsung aja daripada mumet bertele-tele di teori dengan contoh coding sederhana menggunakan web kamera PC/laptop, dan kita gunakan bahasa python serta opencv untuk pengolahan gambarnya. Jangan lupa kode aruco yang saya gunakan adalah april tag jadi sesuaikan dengan  yang kamu pergunakan.




  1. import cv2
  2. import numpy as np
  3. import winsound
  4. import time
  5.  
  6.  
  7.  
  8. # Initialize the AprilTag detector with the 36h11 dictionary
  9. aruco_dict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_APRILTAG_36H11)
  10. parameters = cv2.aruco.DetectorParameters()
  11.  
  12. # Create the detector
  13. detector = cv2.aruco.ArucoDetector(aruco_dict, parameters)
  14.  
  15.  
  16. # Beep function (runs in a separate thread)
  17. def beep():
  18.     winsound.Beep(1000, 200)  # Frequency: 1000 Hz, Duration: 200 ms
  19.     #winsound.PlaySound('beep.wav', winsound.SND_FILENAME)
  20.  
  21.  
  22. # Open webcam
  23.  
  24. cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
  25. cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
  26. cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
  27.  
  28. if not cap.isOpened():
  29.     print("Failed to open webcam.")
  30.     exit()
  31.  
  32. frame_count = 0
  33. try:
  34.     while True:
  35.         ret, frame = cap.read()
  36.         if not ret:
  37.             print("Failed to grab frame. Reconnecting...")
  38.             cap.release()
  39.             e
  40.  
  41.         # Only process every 15th frame to save computational effort
  42.         frame_count += 1
  43.         if frame_count % 5 != 0:
  44.             continue
  45.  
  46.         # Convert the frame to grayscale (required for detection)
  47.         gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  48.  
  49.         # Detect AprilTags
  50.         corners, ids, _ = detector.detectMarkers(gray)
  51.        
  52.         # If any tags are detected
  53.         if ids is not None:
  54.             for corner, tag_id in zip(corners, ids.flatten()):
  55.                 # Draw the bounding box
  56.                 int_corners = corner.astype(np.intp)
  57.                 cv2.polylines(frame, [int_corners], isClosed=True, color=(0, 255, 0), thickness=2)
  58.  
  59.                 # Display the tag ID
  60.                 tag_id_str = f"ID: {tag_id}"
  61.                 cv2.putText(frame, tag_id_str, (int_corners[0][0][0], int_corners[0][0][1] - 10),
  62.                             cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
  63.  
  64.             #beep sound
  65.             beep()
  66.             print(f"Detected IDs: {ids.flatten()}")
  67.         frame_resized = cv2.resize(frame, (800,600))
  68.         # Show the resized video feed
  69.         cv2.imshow("IP Camera apriltag Code Detection - press q to quit", frame_resized)
  70.         # Quit if 'q' is pressed
  71.         if cv2.waitKey(1) & 0xFF == ord('q'):
  72.             break
  73.  
  74. except KeyboardInterrupt:
  75.     print("Program interrupted.")
  76.  
  77. finally:
  78.     # Release the resources
  79.     cap.release()
  80.     cv2.destroyAllWindows()



Dan ini salah satu dokumentasi pemanfaatannya dalam project pendeteksi lari :







Share:

Kontak Penulis



12179018.png (60×60)
+6281331339072

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (14) antares (11) arduino (29) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (27) euro2020 (13) gcc (1) gis (3) gsm (1) iklan (1) infrared (2) Input Output (3) iot (78) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (11) lorawan (2) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (2) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (37) proyek (1) python (11) radio (31) raspberry pi (9) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) SDR (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) statistik (5) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) telkomiot (5) transistor (2) troubleshoot (3) tulisan (96) tutorial (108) tv digital (6) tvri (2) unesa (8) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3) yolo (9)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika