SISTEM MONITORING RUANGAN BERBASIS LASER RANGE FINDER (LRF)
BUDI SANTOSO 41505120018
PROGRAM STUDI TEKNIK INFORMATIKA FAKULTAS ILMU KOMPUTER UNIVERSITAS MERCU BUANA JAKARTA 2009
1
SISTEM MONITORING RUANGAN BERBASIS LASER RANGE FINDER (LRF)
Laporan Tugas Akhir
Diajukan Untuk Melengkapi Salah Satu Syarat Memperoleh Gelar Sarjana Komputer
Oleh: BUDI SANTOSO
41505120018
PROGRAM STUDI TEKNIK INFORMATIKA FAKULTAS ILMU KOMPUTER UNIVERSITAS MERCU BUANA JAKARTA
2009
2
LEMBAR PERNYATAAN
Yang bertanda tangan di bawah ini, NIM
: 41505120018
Nama
: BUDI SANTOSO
Judul Skripsi
: SISTEM MONITORING RUANGAN BERBASIS LASER RANGE FINDER (LRF)
Menyatakan bahwa skripsi tersebut di atas adalah hasil karya saya sendiri dan bukan plagiat, kecuali kutipan-kutipan yang berasal dari sumber-sumber yang telah tercantum pada daftar pustaka. Apabila ternyata ditemukan di dalam laporan skripsi saya terdapat unsur plagiat, maka saya siap untuk mendapatkan sanksi akademik yang terkait dengan hal tersebut.
Jakarta, 4 Februari 2009
Budi Santoso
3
LEMBAR PERSETUJUAN
NIM
:
41505120018
Nama
: BUDI SANTOSO
Judul Skripsi
:
SISTEM MONITORING RUANGAN BERBASIS
LASER
RANGE FINDER (LRF)
Skripsi ini telah diperiksa dan disetujui Jakarta, Februari 2009
Raka Yusuf, ST., MTI. Pembimbing
Devi Fitrianah, S.Kom., MTI Koord. Tugas Akhir Teknik Informatika
Abdusy Syarif, ST., MT KaProdi Teknik Informatika
4
MOTTO DAN PERSEMBAHAN
Jangan malu memperlihatkan ketidaktahuan, karena dari ketidaktahuan tumbuh pengetahuan (Pakubuwono IV. Sultan Yogyakarta, 1862)
Siapa mencintai didikan, mencintai pengetahuan; tetapi siapa membenci teguran adalah dungu (Amsal 12:1)
Ku persembahkan untuk: Ayahanda dan Ibunda yang tercinta Istri terkasih yang selalu mendampingi
5
KATA PENGANTAR
Puji dan syukur atas berkat Tuhan Yang Maha Esa, yang telah melimpahkan segala rahmat dan karunia-Nya sehingga Laporan Tugas Akhir ini dapat penulis selesaikan dengan baik. Sebuah perjalanan yang panjang telah penulis selesaikan dalam menempuh studi dan menulis Laporan Tugas Akhir. Laporan Tugas Akhir ini merupakan salah satu persyaratan yang harus ditempuh untuk menyelesaikan program studi Strata satu (S1) pada Jurusan Teknik Informatika, Fakultas Ilmu Komputer
Universitas Mercu
Buana Jakarta. Adapun Laporan Tugas Akhir ini adalah mengenai Sistem Monitoring Ruangan berbasis Laser Range Finder (LRF). Berkat bimbingan dan arahan-arahan yang diberikan oleh dosen pembimbing maka laporan Tugas Akhir ini dapat penulis selesaikan. Pada kesempatan ini penulis mengaturkan terima kasih yang sedalam-dalamnya kepada yang terhormat: 1. Ayahanda dan Ibunda serta semua saudara-saudara tercinta yang telah memberikan doa dan dorongan semangat kepada penulis untuk terus maju dalam menjalankan hidup, serta untuk melanjutkan studi Strata 1 (S1). Semoga selalu dalam lindungan, berkat dan rahmat Tuhan Yang Maha Esa. 2. Istri tercinta Dinna Rahma Nurfiani, SE., buat perhatian, pengertian, dorongan semangat dan kasih sayangnya selama ini.
6
3. Bapak Raka Yusuf, ST. MTI., selaku dosen pembimbing yang telah banyak memberikan bimbingan serta arahan dari sejak dimulainya penulisan Laporan Tugas Akhir ini hingga selesai. 4. Bapak/Ibu dosen yang telah mendidik, melatih dan membekali penulis dengan ilmu dan pengetahuan selama menuntut ilmu di Program Studi Teknik Informatika, Fakultas Ilmu Komputer, Universitas Mercu Buana. 5. Semua pihak yang telah membantu baik secara moril maupun materiil. Penulis menyadari bahwa materi maupun penulisan Laporan Tugas Akhir ini masih terdapat banyak ketidaksempurnaan, karena kesempurnaan hanya milik Allah dan kekurangan akan selalu ada pada diri manusia. Pada kesempatan ini pula penulis mohon maaf yang sebesar-besarnya atas segala kekurangan yang terdapat pada Laporan Tugas Akhir ini oleh karena itu segala kritik dan saran dari pembaca akan disambut dan diterima dengan senang hati, akhir kata penulis berharap semoga Laporan Tugas Akhir ini dapat bermanfaat bagi kita semua. Amin.
Jakarta, 4 Februari 2009
Budi Santoso
7
ABSTRACTION This paper describes about a room monitoring system based Laser Range Finder (LRF) using web cam and laser pointer. This monitoring system to need hardware and software one another interaction. The hardware would a sensors where a laser-beam is projected onto an object in the field of view of a camera, whereas software would a processed that image to get for information distance results where a laser beam falls onto object. The system was tested at room size 4 m x 6 m. The optical axis of the camera is ideally parallel to get capture projected a laser beam, because a simple algorithm is run over the image looking for the brightest pixels. To get a region the brightest pixel can be made one column, a laser beam falls right a region with certain then can to compare distance to that target may be measure based on a laser beam falls in object with distance already to maping before. The experiment’s result shows that the system is only suitable for low light room monitoring.
Keywords: Room monitoring, Laser Range Finder, Webcam, Laser pointer.
xiv+51 pages; 16 figures; 5 tables; 2 code; 1 technical documentation Bibliography: 9 (2002-2008)
8
ABSTRAKSI
Tugas Akhir ini membahas tentang sistem monitoring ruangan berbasis Laser Range Finder (LRF) dengan memanfaatkan kamera web dan laser penunjuk. Pada sistem monitoring ruangan ini dibutuhkan perangkat keras dan perangkat lunak yang saling berinteraksi. Perangkat keras bertugas sebagai alat pengindera (sensor) di mana berkas laser jatuh pada obyek dapat di tangkap kamera, sedangkan perangkat lunak bertugas untuk mengolah citra yang di dapat untuk menghasilkan informasi jarak di mana berkas sinar laser jatuh pada obyek tersebut. Sistem yang dibuat telah diuji pada ruangan berukuran 4 m x 6 m. Kamera disesuaikan agar dapat menangkap proyeksi berkas sinar, karena program menggunakan algoritma mencari piksel yang paling terang. Untuk mendapatkan lokasi piksel yang paling terang maka dibuat satu area yang berbentuk persegi panjang, berkas sinar laser yang jatuh tepat pada daerah yang ditentukan tersebut maka program akan membandingkan jarak target yang di ukur berdasarkan sinar laser yang jatuh pada objek dengan jarak yang telah dipetakan sebelumnya. Dari hasil pengujian, disimpulkan bahwa sistem ini cocok jika dipakai untuk melakukan monitoring ruangan dengan intensitas cahaya lingkungan yang rendah.
Kata Kunci : Monitor ruangan, Laser Range Finder, kamera web, laser pointer. xiv+51 halaman; 16 gambar; 5 tabel; 2 kode; 1 dokumentasi teknis Daftar acuan: 9 (2002-2008)
9
DAFTAR ISI Halaman i Halaman Judul …………………………………………………………... Lembar Pernyataan ……………………………………………..…….....
ii
Lembar Persetujuan ...…………………………………………………...
iii
Motto dan Persembahan …………………………………………………
iv
Kata Pengantar ………………………………………………………...…
v
Abstraction …………………………………..……………………………
vii
Abstraksi ………………………………………………………………….
viii
Daftar Isi ………………………………………………………………….
ix
Daftar Gambar ……………………………………………………..…….
xii
Daftar Tabel ………………………………………………………...……. xiii xiv Daftar Kode ………………………………………………………………
BAB I
BAB II
PENDAHULUAN 1.1 Latar Belakang Masalah …………………………………..
1
1.2 Rumusan Masalah ………………………………………...
2
1.3 Tujuan Penelitian …………………………………………
3
1.4 Batasan Masalah …………………………………………..
3
1.5 Metodologi Penyelesaian Masalah ………………………..
3
1.6 Sistematika Penulisan ……………………………………..
6
LANDASAN TEORI
10
BAB III
2.1 Sistem Monitoring ………………………………………..
8
2.2 Teknologi Laser Secara Umum ….………………………..
8
2.3 Teori Laser Range Finder (LRF) …….……….…………...
10
2.5 Pengukuran dan Kalibrasi ………………………………...
12
2.6 Sekilas Bahasa Java …………….………………………..
15
ANALISA DAN PERANCANGAN SISTEM 3.1 Analisa …………………………………………………….
17
3.2 Perancangan Sistem dan Perangkat Lunak ……………….
20
3.2.1 Perancangan Masukan ………………………………
21
3.2.2 Perancangan Proses ………………………………….
22
3.2.3 Perancangan Keluaran ………………………………
24
3.2.1 Perancangan Antarmuka ………………………
25
BAB IV IMPLEMENTASI DAN PENGUJIAN 4.1 Implementasi ……………………………………………..
27
4.1.1 Pengodean Blok-blok Penting Program ……………
27
4.1.2 Implementasi Sistem ……………………………….
33
4.1.3 Tampilan Anatarmuka ……………………………..
35
4.2 Pengujian ………………………………………………….
38
4.2.1 Lingkup Pengujuan ………………………………..
38
4.2.1.1 Perangkat Keras ……………………………
38
4.2.1.2 Perangkat Lunak …………………………...
39
4.2.2 Skenario Pengujian ………………………….……..
39
11
BAB V
4.2.3 Hasil Pengujian …………………………………….
43
4.2.4 Analisa Hasil Pengujian ……………………………
46
KESIMPULAN DAN SARAN 5.1 Kesimpulan ……………………………………………….
49
5.2 Saran ………………………………………………………
50 51
DAFTAR PUSTAKA
52
LAMPIRAN - LAMPIRAN
12
DAFTAR GAMBAR
4 Gambar 1.1 Model Waterfall menurut referensi Sommerville …………… Gambar 2.1 Berkas laser yang diproyeksikan pada target ………………..
11
Gambar 3.1 Blok diagram teknologi LRF untuk system keamanan ………
18
Gambar 3.2 Komponen perangkat keras yang digunakan ………………...
21
Gambar 3.3 Berkas laser penunjuk yang diproyeksikan pada target………
21
Gambar 3.4 Diagram alir program ………………………………………..
22
Gambar 3.5 Koordinat layar ………………………………………………
24
Gambar 3.6 Hirarki menu utama ………………………………………….
26
Gambar 3.7 Rancangan antarmuka ……………………………………….
26
Gambar 4.1 Skema ruangan implementasi aplikasi ……………………….
33
Gambar 4.2 Foto ruangan implementasi system ………………………….
34
Gambar 4.3 Tampilan antarmuka system monitoring ruangan …………...
35
Gambar 4.4 Tampilan menu sistem dan submenu connect, disconnect dan keluar ……………………………………………………….
36
Gambar 4.5 Tampilan pesan tidak dapat mengenali berkas laser ………..
36
Gambar 4.6 Tampilan gambar yang ditangkap kamera dan informasi jarak
37
Gambar 4.7 Tampilan dudukan penyangga kamera web dan pointer penunjuk dengan jarak konstan h = 5 cm …………………...
13
39
DAFTAR TABEL
13 Tabel 2.1 Tabel nilai pfc dan D actual ……………………………………. Tabel 2.2 Tabel perhitungan rpc dan ro …………………………………...
14 15
Tabel 2.3 Tabel D actual dan D hasil perhitungan ………………………... 41 Tabel 4.1 Tabel data pengujian …………………………………………… 41 Tabel 4.2 Tabel data hasil pengujian ……………………………………..
14
DAFTAR KODE
29 Kode 4.1 Proses informasi jarak yang dimasukan 32 Kode 4.2 Proses untuk dibandingkan dengan nilai tr, tg dan tb
15
BAB I PENDAHULUAN
1.1 Latar Belakang Masalah Keamanan merupakan sesuatu hal yang sangat didambakan oleh setiap orang, untuk mendapatkan rasa aman tersebut orang-orang berusaha semampunya meskipun harus mengeluarkan uang yang tidak sedikit. Keamanan tidak hanya untuk manusia saja, tetapi ada hal yang harus diamankan yaitu rumah, karena rumah adalah tempat semua orang ingin mendapatkan perlindungan dari berbagai macam gangguan dari luar. Sebenarnya banyak sekali cara yang dapat dilakukan untuk mengamankan rumah kita dari hal-hal yang tidak diinginkan. Antara lain seperti memelihara anjing penjaga bahkan mempekerjakan penjaga keamanan. Tetepi semua itu mempunyai kekurangan dari segi biaya operasional yang sangat tinggi, sehingga tidak semua orang mampu melakukannya, pemasangan alarm mungkin solusi yang tepat karena sangat ekonomis. Untuk mengamankan rumah, maka diperlukan suatu alat dan sistem yang dapat memberikan keamanan pada rumah dan dapat memberikan informasi kepada pemilik
16
rumah khususnya dan pada semua orang pada umumnya. Subsistem keamanan salah satunya sistem monitoring yang merupakan kelas sistem yang cukup standar untuk sistem real-time (waktu nyata), sistem tersebut harus dapat berjalan secara otomatis karena semua kerja dilakukan oleh sistem itu sendiri. Oleh karena itu, untuk membuat sistem tersebut dibutuhkan suatu hardware (perangkat keras) dan software (perangkat lunak) yang saling berinteraksi. Perangkat keras berfungsi sebagai alat pengindera (sensor) di mana berkas laser jatuh pada obyek, sedangkan perangkat lunak berfungsi untuk mengolah citra yang didapat untuk menghasilkan informasi jarak. Pada tugas akhir ini perangkat keras yang digunakan dengan memanfaatkan kamera web atau sering juga disebut webcam (kamera video yang di desain untuk berhubungan dengan PC) dan laser pointer (penunjuk) yang pada umumnya hanya digunakan sebagai penunjuk presentasi saja. Pemilihan perangkat keras ini sangat memperhatikan sisi ekonomis, efektif dan mudah dalam instalasinya. Sedangkan untuk perangkat lunak yang digunakan adalah java dengan library yang bersifat open source (bahasa pemrograman yang tersedia secara gratis, boleh dimodifikasi dan digunakan oleh siapa saja), yaitu Lejos sehingga dapat disesuaikan dengan kebutuhan.
1.2 Rumusan Masalah Dari hasil pengamatan dan dari uraian di atas, dapat di rumuskan masalahnya adalah ’’Bagaimana memanfaatkan kamera web dan laser penunjuk untuk membantu memonitoring ruangan di dalam rumah?’’
17
1.3 Tujuan Penelitian Tujuan pembahasan dalam tugas akhir ini adalah: 1.
Untuk mempelajari bagaimana merancang sistem monitoring ruangan di dalam rumah dengan memanfatkan kamera web dan laser penunjuk.
2.
Menciptakan suatu sistem monitoring ruangan berbasis laser range finder (LRF).
3.
Mengetahui proses perancangan perangkat lunak sistem waktu nyata.
1.4 Batasan Masalah Dalam Laporan Tugas Akhir ini hanya akan dibahas masalah: 1.
Merancang suatu aplikasi yang dapat membantu memonitoring ruangan di dalam rumah yang didasarkan pada teknologi LRF.
2.
Alat pengindera (sensor) dan pengolahan citra yang didapat untuk mengukur jarak dengan memanfaatkan kamera web dan laser penunjuk.
3.
Data-data yang dipakai sebagai proses pembelajaran dan kalibrasi adalah informasi jarak dari obyek-obyek yang ada di sekitanya, yang diperoleh dengan menggunakan teknologi LRF.
1.5 Metodologi Penyelesaian Masalah Metodologi yang digunakan untuk mendukung pembuatan Tugas Akhir ini adalah sebagai berikut: 1. Model proses pengembangan perangkat lunak Model proses yang digunakan yaitu model Waterfall(air terjun) atau juga disebut siklus hidup perangkat lunak. Model ini adalah model klasik yang bersifat
18
sistematis, berurutan dalam membangun perangkat lunak yang mengambil kegiatan proses dasar seperti spesifikasi, pengembangan, validasi, dan evolusi, dan merepresentasikannya sebagai fase-fase proses yang berbeda. Karena penurunan dari fase ke fase yang lainnya maka model ini dikenal sebagai ’model air terjun’ atau siklus hidup perangkat lunak. Berikut ini ada gambaran dari model Waterfall menurut referensi Sommerville: Definisi persyaratan Perancangan system dan perangkat lunak Implementasi dan pengujian unit
Integrasi dan pengujian sistem Operasi dan pemeliharaan
Gambar 1.1 Model Waterfall menurut referensi Sommerville Dari tahapan-tahapan utama pada Gambar 2.1 memetakan kegiatan-kegiatan pengembangan dasar yaitu: 1.
Analisis dan definisi persyaratan. Pelayanan, batasan, dan tujuan sistem ditentukan melalui konsultasi dengan user (pengguna) sistem. Persyaratan ini kemudian didefinisikan secara rinci dan berfungsi sebagai spesifikasi sistem.
19
2.
Perancangan sistem dan perangkat lunak. Proses perancangan sistem membagi persyaratan dalam sistem perangkat keras dan perangkat lunak. Kegiatan ini menentukan arsitektur sistem secara keseluruhan.
3.
Implementasi dan pengujian unit. Pada tahap ini perancangan perangkat lunak direalisasikan sebagai serangkaian program atau unit program. Pengujian unit melibatkan verifikasi bahwa setiap unit telah memenuhi spesifikasinya.
4.
Integrasi dan pengujian sistem. Unit program atau program individual diintegrasikan dan diuji sebagai sistem yang lengkap untuk menjamin bahwa persyaratan sistem telah dipenuhi.
5.
Operasi dan pemeliharaan. Fase ini merupakan fase siklus hidup yang paling lama. Sistem di instal dan digunakan. Pemeliharaan mencakup koreksi dari berbagai error (kesalahan) yang tidak ditemukan pada tahap-tahap terdahulu, perbaikan atas implementasi unit sistem dan pengembangan pelayanan sistem, sementara persyaratanpersyaratan baru ditambah (Sommerville,2003:43).
2. Studi pustaka / literatur Pengumpulan data yang dilakukan dengan cara memperoleh dari buku-buku, majalah dan artikel yang ada di internet untuk mendapatkan teori-teori yang berhubungan dengan topik tugas akhir.
20
1.6 Sistematika Penulisan Sistematika dalam penyusunan tugas akhir ini agar lebih mudah dimengerti, karena dalam suatu laporan diperlukan sistematika yang baik, sehingga aliran informasi yang disampaikan jelas, yang dituangkan dalam 5 (lima) bab, sebagai berikut: BAB I PENDAHULUAN Bab ini berisi latar belakang masalah, rumusan masalah, batasan masalah, tujuan penelitian, metodologi penelitian dan sistematika penulisan. BAB II LANDASAN TEORI Bab ini akan mengemukakan tentang landasan teori, yang akan menjelaskan sistem monitoring, teknologi laser secara umum, teori dasar Laser range Finder (LRF), pengukuran dan kalibrasi, sekilas tentang java. BAB III ANALISIS DAN PERANCANGAN Bab ini berisi analisis dan perancangan sistem, yang akan membahas analisis,
perancangan sistem dan perangkat lunak yang meliputi
perancangan masukan, perancangan proses, perancangan keluaran dan perancangan antarmuka. BAB IV IMPLEMENTASI DAN PENGUJIAN Bab ini berisi implementasi, meliputi pengodean blok-blok penting, implementasi sistem, tampilan antarmuka. Pengujian meliputi lingkup pengujian terdiri dari perangkat keras dan perangkat lunak, skenario pengujian, hasil pengujian serta analisa hasil pengujian.
21
BAB V
KESIMPULAN DAN SARAN Bab ini berisi kesimpulan dan saran, yang pembuatan tugas akhir ini.
22
merupakan hasil akhir dari
BAB II LANDASAN TEORI
2.1 Sistem Monitoring Banyak hal yang diusahakan oleh kita untuk meningkatkan efisiensi. Mulai dari waktu kerja sampai lingkungan sekitar dikontrol untuk tujuan efisiensi. Salah satunya sistem monitoring yang dapat digunakan untuk memonitor keadaan dalam suatu ruangan. Sistem monitoring merupakan kelas sistem yang cukup standar untuk sistem waktu nyata. Sistem ini memeriksa sensor yang memberikan informasi mengenai lingkungan sistem dan mengambil tindakan sesuai dengan hasil pembacaan sensor. Sistem monitoring mengambil tindakan ketika dideteksi nilai sensornya eksepsional. Proses perancangan dimulai dengan mengidentifikasi stimuli aperiodik yang diterima sistem dan respon yang berhubungan (Sommerville,2003:277-278).
2.2 Teknologi Laser Secara Umum Secara fisik laser merupakan suatu alat yang memancarkan sinar melalui mekanisme tertentu. Pada tahun 1917 istilah Laser (light amplification by stimulated emission of radiation) berdasarkan dasar pemikiran Albert Einstein dalam naskahnya
23
Zur Quantentheorie der Strahlung (On the Quantum Theory of Radiation). Dalam situs Wikipedia. Dilihat tanggal 24 April 2008. http://en.wikipedia.org/wiki/Laser . Saat ini penggunaan laser mencakup berbagai bidang, seperti kesehatan, hiburan, militer, hingga sistem teknologi pengamanan dan terus berkembang sejak ditemukan pada tahun 1958. Secara umum laser dapat diklasifikasikan menjadi beberapa class yaitu: 1.
Laser Class 1 Laser jenis ini tidak berbahaya, jika ditatap terus menerus. Biasanya laser jenis ini biasanya tidak kasat mata dan banyak digunakan pada teknologi percetakan, seperti pada printer laser.
2.
Laser Class 1M Laser jenis ini tidak berbahaya jika harus ditatap terus-menerus dengan mata telanjang. Akan tetapi menjadi berbahaya, jika ditatap dengan bantuan optik. Laser-laser dengan jenis di atas 1M biasanya diberi label khusus.
3.
Laser Class 2 Laser jenis ini kasat mata dengan panjang gelombang 400-700 nm. Tidak berbahaya apabila tidak ditatap langsung. Biasanya laser penunjuk menggunakan laser jenis ini.
4.
Laser Class 2M Laser jenis ini juga kasat mata dan memiliki panjang gelombang 400-700 nm. Tidak berbahaya apabila tidak ditatap langsung. Sebaliknya sangat berbahaya apabila ditatap langsung terus menerus, apalagi dengan bantuan optik.
24
5.
Laser Class 3R Laser jenis ini memiliki panjang gelombang 302.5 nm-1 mm. Sangat berbahaya bila ditatap langsung. Penggunaan laser jenis ini dilakukan dengan prosedur keamanan yang ketat.
6.
Laser Class 3B Laser jenis ini dapat megakibatkan kerusakan pada mata atau kulit bila ditatap langsung.
7.
Laser Class 4 Laser jenis ini dapat mengakibatkan luka bakar pada kulit apalagi pada mata. Penggunaan laser jenis ini harus menerapkan prosedur standar keamanan yang sangat baik (Ferry Gunawan,2005:2-3).
2.3 Teori Dasar Laser Range Finder (LRF) Ada banyak teknologi yang digunakan untuk pengukuran jarak, di antaranya menggunakan ultrasonic (frekuensi suara yang berada pada kisaran diatas 20 kHz), infrared (gelombang cahaya infra merah), bahkan dengan menggunakan sinar laser. Salah satu metode yang digunakan untuk mendeteksi obyek yaitu dengan pengukuran jarak. Untuk lebih jelas cara kerjanya lihat Gambar 2.1.
25
Gambar 2.1 Berkas laser yang di proyeksikan pada target
Gambar 2.1 menunjukan berkas sinar laser yang diproyeksikan pada suatu target yang tidak terhalang oleh obyek. Berkas sinar laser yang diproyeksikan ke dalam obyek ditangkap kamera. Kamera disesuaikan untuk dapat menangkap berkas sinar laser pada target sehingga dengan perhitungan sederhana dapat menentukan informasi jarak (D) dari target tersebut. Ketika berkas sinar laser yang diproyeksikan pada target terhalang obyek (penyusup) maka informasi jarak yang diperoleh akan berbeda pula. Dengan mengukur perbedaan jarak inilah, dapat diketahui apakah terdapat obyek yang menghalangi berkas sinar laser tersebut. Sensor dalam hal ini digunakan kamera web dan machine vision (mesin pandang) dalam hal ini sebagai algoritma pendeteksi berkas sinar laser (Danko, Todd, 2002). Dari gambar 2.1 maka jarak D dapat diperoleh dengan rumus:
D=
h tan
... (1)
Dimana: h = jarak konstan antara laser penunjuk dan kamera
26
θ = pfc * rpc + ro pfc = jumlah piksel dari pusat focal plane ( bidang datar pada sudut kanan sumbu optik lensa yang menangkap gambar) rpc = radians per piksel pitch (ukuran terkecil bit data dalam gambar video) ro = radians offset (kompensasi error) sehingga dari persamaan 1 diperoleh:
D=
h tan (pfc*rpc + ro)
...(2)
2.5 Pengukuran dan Kalibrasi Demikian juga dengan parameter pfc, yaitu jumlah piksel dari pusat focal plane agar berkas sinar laser yang kelihatan dapat di hitung dari gambar yang diperoleh dari kamera. Parameter yang lain, yaitu rpc dan ro diperoleh dari hasil pengukuran dan kalibrasi. Untuk melakukan sistem kalibrasi diperlukan beberapa pengukuran, yaitu jarak yang diukur pada obyek tertentu (D) yang telah diketahui nilainya. Demikian juga dengan nilai pfc di hitung dari gambar yang diperoleh. Berikut ini rumus untuk menghitung pfc :
pfc = (Ymax/2) – Y’
... (3)
Dimana : Ymax = jarak maksimum y Y’
= posisi berkas laser yang jatuh pada sumbu Y
Tabel 2.1 berisi hasil pengukuran yang diperoleh.
27
Tabel 2.1. Tabel nilai pfc dan D aktual h 5 5 5 5 5 5 5 5 5 5
piksels from center (pfc) 103 81 65 55 49 45 41 39 37 35 551
D actual (cm) 29 45 58 71 90 109 127 159 189 218
Untuk menghitung sudut aktual berdasarkan nilai dari h dan jarak aktual (D actual) dengan persamaan berikut ini:
h
θ actual = arctan
Dactual
... (4)
Dimana :
θ actual
= sudut aktual
D actual = jarak aktual (yang telah diketahui) terhadap target. Dari data Tabel 2.1 dapat di masukan kedalam persamaan (4) yaitu :
θ actual = arctan
5 29
= 0.170735211 dan begitu juga seterusnya untuk mencari nilai yang lain. Untuk mencari nilai rpc dan ro terlebih dahulu kita cari nilai berikut ini:
pfc=pfc-(pfc_total/n_pfc) = 103-(551 / 10) =103-(55.1) = 47.9
28
... (5)
θ actual = θ actual - (θ actual_Total / n_θ actual
... (6)
)
= 0.170735211-(0.659197673 / 10) = 0.170735211-(0.065919767) = 0.104815444
dari persamaan (5) dan (6) baru dapat dicari nilai rpc dan ro: rpc = 0.104815444 /47.9 = 0.002188
ro = (θ actual_Total / n_θ actual
)
- (pfc_total/n_pfc x rpc)
= (0.065919767) – (55.1 x 0.002188) = -0.05465
Dari hasil perhitungan di atas dimasukan ke dalam Tabel 2.2. Tabel 2.2. Tabel perhitungan rpc dan ro
h 5 5 5 5 5 5 5 5 5 5
piksels from center (pfc)
D actual (cm)
103 81 65 55 49 45 41 39 37 35
29 45 58 71 90 109 127 159 189 218
Theta_actual: arctan (h/D_actual) (degree) 0.170735211 0.110657221 0.085994291 0.070306464 0.055498505 0.045839426 0.039349756 0.031436181 0.026448857 0.022931759
rpc 0.002188 0.001727 0.002028 0.004874 0.001708 0.001988 0.001884 0.002142 0.002181 0.002139 0.002286
ro -0.05465 -0.02926 -0.04581 -0.20264 -0.02821 -0.04363 -0.03791 -0.0521 -0.05424 -0.05192 -0.06004
Dari kalibrasi data Tabel 2.2 dapat diperoleh nilai konstanta rpc dan ro yang akan dimasukan dalam program.
29
Gain (rpc) = 0,002286 radians/piksel (perbandingan antara banyak sinyal yang di keluarkan dengan jumlah sinyal semula/yang dimasukan)
Offset (ro) = -0,06004 radians (posisi; alamat pada segmen) Dengan menggunakan persamaan (2) dapat menghitung D aktual dan D yang diperoleh dari hasil perhitungan dan presentasi kesalahan seperti tabel berikut ini :
Tabel 2.3. Tabel D aktual dan D hasil perhitungan piksels from center (pfc)
D hasil perhitungan
103 81 65 55 49 45 41 39 37 35
(cm)
D actual (cm)
% error
29.84 41.46 57.55 75.81 93.57 110.85 135.94 153.27 175.66 205.70
29 45 58 71 90 109 127 159 189 218
2.88 -7.87 -0.78 6.77 3.96 1.70 7.04 -3.60 -7.06 -5.64
2.6 Sekilas Bahasa Java Java merupakan bahasa pemograman serbaguna, yang dikembangkan oleh Sun Microsystem pada agustus 1991, dengan nama semula Oak. Pada Januari 1995, karena nama Oak dianggap kurang komersial, maka diganti menjadi Java. Dalam sejumlah literatur disebutkan bahwa Java merupakan hasil perpaduan sifat dari sejumlah bahasa pemrograman, yaitu C, C++, object-C, SmallTalk, dan common LISP. Program Java bersifat tidak bergantung pada platform, artinya Java dapat dijalankan pada sebarang komputer dan bahkan pada sebarang sistem operasi.
30
Program Java dapat dibedakan menjadi dua jenis, yaitu : 1. Applet adalah program yang dibuat dengan Java, dapat diletakkan pada web
server dan diakses melalui web browser. 2.
Aplikasi adalah program yang dibuat dengan Java yang bersifat umum. Aplikasi dapat dijalankan secara langsung, tidak perlu perangkat lunak browser untuk menjalankannya (Abdul Kadir,2005:2-8).
Untuk mengembangkan aplikasi berbasis Java, memerlukan Java Development Kit (JDK). Java 2 platform, dibagi menjadi tiga kategori, yaitu : 1. Java 2 Standard Edition (J2SE) Kategori ini digunakan untuk mengembangkan dan menjalankan aplikasi Java berbasis PC. 2. Java 2 Enterprise Edition (J2EE) Kategori ini digunakan untuk mengembangkan dan menjalankan aplikasi Java pada lingkungan enterprise, dengan fungsi-fungsi seperti Enterprise Java Bean
(EJB), COBRA, Servlet dan Java Server Page (JSP). 3. Java 2 Micro Edition (J2ME) Kategori ini digunakan untuk mengembangkan dan menjalankan aplikasi Java berbasis handheld device, seperti Personal Data Assistant (PDA), handphone dan pocketPC (Setiyo Cahyono,2006:2-3).
31
BAB III ANALISIS DAN PERANCANGAN SISTEM
Salah satu tahapan penting dalam pembuatan sebuah sistem adalah menentukan analisis pengguna dan kebutuhan pengguna dari sistem itu sendiri. Pada tahapan analisis kebutuhan ini perlu dicermati mengenai sistem tersebut nantinya akan digunakan oleh siapa dan tujuan dari pembuatan sistem tersebut. Dengan demikian sistem yang dibuat akan mudah digunakan dan dimengerti oleh user (pemakai). Setelah analisis kebutuhan diketahui dan ditetapkan, kemudian diteruskan dengan perancangan dari sistem itu sendiri. Dengan melakukan perancangan sistem terlebih dahulu, maka dapat lebih mudah dituangkan di dalam program.
3.1 Analisis Beranjak dari ide memikirkan pengembangan sistem monitoring ruangan berbasis LRF yang terkomputerasi khususnya di kalangan rumah tangga yang telah memiliki komputer di rumah, yang dibuat dari teknologi pendeteksi gerak (motion
detector) yang sekarang sudah banyak digunakan, maka di sini mencoba
32
memanfaatkan teknologi LRF yaitu suatu sistem yang berguna untuk mengukur jarak dengan memanfaatkan kamera web dan laser penunjuk. Pada sistem ini, menggunakana analisa dan kalibrasi piksel pada gambar, metode yang digunakan untuk mendeteksi obyek yaitu dengan pengukuran jarak di mana berkas sinar laser jatuh pada obyek tersebut. Dari informasi jarak yang diperoleh dengan menggunakan teknologi LRF, maka dapat memetakan statistik informasi jarak dari obyek-obyek yang ada disekitarnya dengan asumsi pada saat pemetaan tidak ada obyek ”penyusup” atau obyek yang tidak dikenali. Data yang didapat pada proses ini digunakan sebagai proses pembelajaran dan kalibrasi. Proses ini dilakukan saat pertama kali sistem dijalankan. Hasil yang diperoleh akan dibandingkan pada saat sistem beroperasi. Jika terdapat perbedaan informasi jarak dengan data-data statistik informasi jarak yang diukur sebelumnya, maka diasumsikan adanya penyusup. Informasi tersebut akan dikirim ke sistem kontrol pusat untuk diolah lebih lanjut untuk membangkitkan event-event (Kejadian), seperti mengalkulasi lokasi penyusup, menyalakan kamera untuk menangkap gambar dan lain sebaginya.
Area Laser Sensor Pengawas Penyusup
Area Laser Sensor
Sistem Kontrol Pusat
Pengawas
Gambar 3.1 Blok diagram teknologi LRF untuk sistem keamanan
33
Akan tetapi dalam implementasi program, untuk mendapatkan hasil yang sesuai dengan yang diinginkan maka program harus dijalankan dan ditampilkan sesuai dengan algoritma pendeteksi berkas sinar laser. Pada kasus ini di kembangkan suatu sistem keamanan dengan menggunakan sensor visual berupa kamera web dan sensor laser penunjuk. Sensor fungsi utamanya adalah sebagai indera dari sistem keamanan. Kamera web berfungsi sebagai sensor untuk menangkap berkas sinar laser. Posisi berkas akan dikalkulasi oleh algoritma software untuk menghasilkan informasi jarak. Sensor kamera dikendalikan dengan PC melalui kabel USB menggunakan mini kamera web standar dari prolink PCC5020 dengan resolusi gambar 640 x 480 serta ketajaman gambar 24-bit per piksel. Sensor laser penunjuk berfungsi sebagai media pengukur jarak. Berkas sinar laser yang diproyeksikan berbentuk titik berwarna merah namun biasanya proyeksi berkas laser yang ditangkap oleh kamera web berwarna putih. Aplikasi dilakukan pada ruangan berukuran 4 m x 6 m. Kamera disesuaikan untuk dapat menangkap proyeksi berkas sinar laser pada target dan diletakan pada dudukan yang dapat berotasi pada sumbunya untuk memperluas area pemindaian. Jika semuanya berjalan dengan baik, maka program akan menampilkan gambar yang ditangkap oleh kamera web. Sebelumnya aplikasi akan memetakan informasi jarak terlebih dahulu. Selama pemetaan berlangsung, posisi pintu utama dan jendela dalam keadaan tertutup dan tidak ada obyek yang tidak dikenali (penyusup). Setelah pemetaan selesai dilakukan dan aplikasi dijalankan, bila pintu utama dalam keadaan terbuka dan memotong berkas laser, maka informasi jarak tersebut tentu akan berubah. Karena terdapat perbedaan statistik informasi yang telah dilakukan sebelumnya dengan informasi jarak hasil pemetaan maka diasumsikan ada penyusup
34
yang melintas, di layar akan tampil pesan peringatan “Penyusup tedeteksi” dan informasi jarak penyusup tersebut tampil pula di layar seperti koordinat sumbu x, koordinat sumbu y serta jarak. Perputaran pengambilan gambar dilakukan terus menerus dengan interval waktu selama 10 ms. Selanjutnya, aplikasi eksternal dapat menggunakan informasi ini sesuai dengan desain proses, yaitu apakah akan membunyikan alarm, mengirimkan pesan SMS, memanggil polisi setempat, dan lain sebaginya. Perlu diperhatikan adalah proyeksi berkas sinar laser tersebut harus dapat ditangkap oleh kamera, karena program menggunakan algoritma mencari piksel yang paling terang berdasarkan komposisi nilai RGB (Red-Green-Blue) sehingga sumber cahaya lain seperti lampu harus diatur sedemikian rupa agar proyeksi berkas laser merupakan piksel yang paling terang. Penempatan kamera dan laser penunjuk juga harus disesuaikan tinggi rendahnya dudukan karena bisa saja obyek-obyek lain seperti binatang peliharaan juga akan melintas berkas sinar laser, ataupun penyusup yang melewati diatas atau dibawah berkas sinar laser. Hal ini merupakan kelemahan dari sistem ini.
3.2 Perancangan Sistem dan Perangkat Lunak Beberapa tahapan penting yang dilakukan dalam perancangan sistem monitoring ini adalah sebagai berikut: 1. Perancangan Input (Masukan) 2. Perancangan Process (proses) 3. Perancangan Output (keluaran)
35
Di bawah ini akan dijelaskan mengenai tahapan perancangan sistem tersebut satu persatu.
3.2.1 Perancangan Masukan Tahap awal dari perancangan masukan ini adalah pembuatan sebuah perangkat keras sebagai alat masukan yang selalu dimonitor oleh sistem, yaitu berupa sebuah kamera web dan laser penunjuk. Laser penunjuk yang diproyeksikan pada suatu target dapat ditangkap oleh kamera akan diolah oleh algoritma program berdasarkan piksel yang paling terang.
Laser Penunjuk
Kamera Web
Gambar 3.2 Komponen perangkat keras yang digunakan
Berkas laser penunjuk yang diproyeksikan dapat ditangkap oleh kamera, menghasilkan area yang paling terang
Gambar 3.3 Berkas laser penunjuk yang diproyeksikan pada target
36
3.2.2 Perancangan Proses Pada perancangan proses, tahap awal yaitu pembuatan flowchart (diagram alir) yang merupakan tahap awal dari perancangan sistem. Hal ini berfungsi untuk menunjukan arah aliran data, bagaimana data dimasukkan ke dalam sistem kemudian bagaimana data tersebut diproses oleh sistem sehingga menghasilakan suatu keluaran seperti yang diinginkan. Gambar 3.4 Menunjukan proses alir program yang dibuat. Start
Connect
Mengumpulkan statistik informasi jarak = vR Dapatkan informasi jarak aktual = R
N vR = R ?
Peringatan: Penyusup terdeteksi !!
Set flag=1 Set Flag = 0
N Disconnect?
Start
Gambar 3.4 Diagram alir program
37
Berikut ini keterangan Gambar 3.4: 1. Saat koneksi dijalankan, maka program akan mengumpulkan statistik informasi jarak yang diproleh selama selang waktu tertentu. 2. Statistik informasi tersebut dikumpulkan dalam bentuk vector, vR. Saat proses dilakukan, pastikan tidak ada penyusup atau obyek yang tidak dikenali. 3. Dari hasil jatuhnya berkas sinar laser pada target diperoleh informasi jarak aktual
R. 4. Jarak R yang diperoleh akan dibandingkan dengan statistik informasi jarak vR. Jika hasilnya memiliki perbedaan, maka program akan men-set flag=1 sebaliknya, flag=0. 5. Periksa apakah user menghentikan jalannya program? Jika ya, maka program akan berhenti dan jika sebaliknya, proses akan kembali ke point.3.
Setelah sistem menerima semua data masukan maka selanjutnya sistem monitoring akan mengolah data tersebut agar dapat menghasilkan keluaran sesuai dengan yang diinginkan. Masukan yang terdiri dari statistik informasi jarak akan disimpan dalam bentuk vector. Informasi jarak yang dimasukan ke dalam vector harus identik. Untuk mendapatkan lokasi piksel yang paling terang maka di buat satu area yang berbentuk persegi panjang, jika program tidak berhasil menemukan piksel yang paling terang dengan asumsi laser pointer belum dinyalakan, maka program akan memberikan peringatan. Informasi jarak akan dijadikan vector target yang akan dicapai oleh sistem saat proses kalibrasi.
38
Pada proses kalibrasi ini digunakan, maka program akan membandingkan informasi jarak yang diperoleh dengan statistik informasi yang telah dikumpulkan sebelumnya dalam bentuk vector. Jika terdapat perbedaan, maka alert bernilai true, dan sebaliknya alert bernilai false. Jika alert bernilai true, di layar akan tampil peringatan “Penyusup terdeteksi”, maka program akan meng-update status dengan field status di-set 1, sebaliknya jika alert bernilai false, maka field status di-set 0.
3.2.3 Perancangan Keluaran Pada perancangan keluaran, hasil dari proses kalibrasi akan di tampilkan sebagai vector keluaran. Saat melakukan proses kalibrasi dan penyusup dikenali, hasilnya akan ditampilkan di vector keluaran tersebut. Sistem akan menampilkan koordinata layar yang berguna untuk perhitungan lokasi.
640,480 Y Region yang akan diperiksa
0,0 X
Gambar 3.5 Koordinat layar
39
Koordinat (0,0) terletak pada pojok kiri bawah, sedangkan koordinat maksimum sesuai dengan resolusi maksimum yang digunakan dalam hal ini (640,480) terletak di pojok kanan atas. Area yang diarsir yang terletak ditengah koordinat dengan satu
listener (pendengar), merupakan area yang akan dimonitor oleh program. Pendengar berguna untuk membangkitkan kejadian berupa informasi jarak apabila layar terdeteksi piksel yang paling terang yang diasumsikan sebagai proyeksi berkas sinar laser pada target. Jika berkas laser jatuh pada area tersebut, maka program akan memperhitungkan informasi jarak yang diperoleh. Sedangkan jika berkas sinar laser jatuh di luar area tersebut, maka program akan mengabaikannya.
3.2.3.1 Perancangan Antarmuka Program yang akan dibuat menggunakan bahasa java dengan paket J2SE dan sebagai interface (Antarmuka) sistem dalam mengakses sumber peralatan masukan berupa gambar dari kamera dan laser penunjuk maka digunakan aplikasi tambahan berupa Java Media Framework (JMF). Perancangan antarmuka hanya terdiri atas 2(dua) menu utama, yaitu menu
Sistem dan menu Help. Menu-menu tersebut mengelompokan sub-sub menu. Untuk menu Sistem terdapat submenu: - Connect, berfungsi untuk menjalankan aplikasi atau koneksi ke server. - Disconnect, berfungsi untuk memutuskan koneksi ke server. - Keluar, berfungsi untuk keluar dari aplikasi. Sedangkan pada menu Help hanya terdapat submenu ’Info’ yang berisi tentang informasi aplikasi.
40
Struktur program aplikasi secara lebih lengkap dan jelas dapat dilihat pada gambar 3.5.
Perancangan Antarmuka system aplikasi Menu Sistem
Connect Disconnect Keluar
Help
Info
Gambar 3.6 Hirarki Menu Utama
Berdasarkan rancangan yang telah dibuat, maka dihasilkan suatu program untuk menampilkan hasil atau keterangan tentang gambar yang ditangkap kamera web serta informasi jarak yang diperoleh. Sistem Monitoring Ruangan Berbasis LRF Sistem
Help
+ 45
Gambar 3.7 Rancangan Antarmuka
41
BAB IV IMPLEMENTASI DAN PENGUJIAN
Setelah melalui tahap analisis dan perancangan, maka tahap selanjutnya implementasi dan pengujian. Pada tahap ini akan dijelaskan secara umum tentang implementasi dan pengujian sistem monitoring ruangan berbasis LRF yang diambil berdasarkan hasil analisis dan perancangan yang telah dilakukan sebelumnya.
4.1 Implementasi Implementasi Sistem Monitoring Ruangan Berbasis LRF ini menggunakan program Java, yang akan di bahas terdiri dari coding (pengodean) blok-blok penting program, implementasi sistem, serta tampilan antarmuka.
4.1.1 Pengodean blok-blok penting Program Program aplikasi yang dibuat diberi nama dengan Sistem Monitoring Ruangan Berbasis LRF. Program utama terdiri atas SimoruLRF.java, di mana aliran program utama berada dan ColorEffect.java, di mana algoritma pencari piksel yang paling
42
terang berada. Program-program lain merupakan program pendukung, dimana penulis mengambilnya dari librari Lejos. Berikut
ini
penjelasan
pengodean
blok-blok
penting
program
SimoruLRF.java. Untuk senarai kode program yang lengkap terdapat pada lampiran.
Method Main() Point awal SimoruLRF.java pada method main() baris 37, yaitu: public static void main(String [] args
Untuk membuat satu region (daerah) yang berbentuk persegipanjang untuk mendapatkan lokasi piksel yang paling terang dan juga ditambahkan pendengar kedalamnya, daerah tersebut memiliki koordinat awal (160,0) dan koordinat akhir (320,480), terdapat pada baris 47 dan 48. Vision.addRectRegion(1, 160, 0, 320, 480); Vision.addColorListener(1, listener, 0);
Baris 67 menghentikan proses sementara hingga event Connect() dijalankan user, Vision.p.stop();
Method doCalibrate() Method
doCalibrate()
pada baris 135 berfungsi untuk mengumpulkan statistik
informasi jarak yang disimpan dalam bentuk vector. Method ini memiliki returncode true atau false. Baris 136-139 menginisialisasi variabel-variabel awal. int f boolean added GetCheck doRun
= = = =
0; false; false; true;
43
Untuk mengosongkan vector vec dan men-set ukurannya menjadi 0 terdapat pada baris 141 dan 142 yaitu: vec.removeAllElements(); vec.setSize(0);
Baris 144 dan 174 melakukan looping (berputar) hingga doRun bernilai false, while(doRun)
Baris 146, jika f lebih besar dari 100, maka akhiri berputar. if(f>=100) doRun = false;
Baris 148-164, informasi jarak yang dimasukan ke dalam vector vec harus identik, jadi tidak ada informasi jarak yang sama, dapat dilihat kode 4.1.
Kode 4.1. Proses informasi jarak yang dimasukan 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
if(vec.isEmpty()) vec.addElement(Integer.toString(range)); else { for(int g=0; g
Baris 178-186 jika program tidak berhasil menemukan piksel yang paling terang dengan asumsi laser penunjuk belum dinyalakan, maka program akan memberikan pesan dan beri nilai GetCheck = false, if(vec.size() <= 1) { if(Integer.parseInt( (String) vec.elementAt(0))==0) {
44
JOptionPane.showMessageDialog(optionPane,"Tidak Dapat Tersambung, Silakan Tombol Laser dinyalakan", "Kesalahan", JOptionPane.INFORMATION_MESSAGE); Vision.p.stop(); } else GetCheck = true; } else GetCheck = true;
Dan program akan mengembalikan nilai GetCheck. return GetCheck;
Constructor SimoruLRF() Metode SimoruLRF () membuat dan menjalankan thread pTimer yang berfungsi untuk mendapatkan informasi jarak. pTimer m_pTimer = new pTimer(); m_pTimer.start();
Inner class pTimer() Baris 233-234 Untuk men-set variabel awal boolean alert = false; int d = 0;
Baris 237-277, thread akan melakukan berputar terus menerus dan disertai sleep (pudar) selama 10 ms. Method getRange() akan dieksekusi untuk mendapatkan informasi jarak yang disimpan pada variabel range. while(true){ try { Thread t = Thread.currentThread(); t.sleep(10); range = Vision.getRange(); ..... }
Pada baris 243, jika proses kalibrasi berhasil ditandai dengan GetCheck bernilai true,
maka program akan membandingkan informasi jarak yang diperoleh dengan
45
statistik informasi yang telah dikumpulkan sebelumnya dalam bentuk vector vec. Jika terdapat perbedaan, maka alert bernilai true, dan sebaliknya alert bernilai false. if(GetCheck) { for(int h=0; h < vec.size(); h++) { d = Integer.parseInt( (String) vec.elementAt(h)); if(d==range && range!=0) { alert = false; break; } else alert = true; } ..... }
Berikut ini penjelasan pengodean blok-blok penting program ColorEffect.java. Untuk senarai kode program yang lengkap terdapat pada lampiran.
Method Process() Nilai rpc, ro dan h yang telah dibahas sebelumnya pada bab 2 diberikan kepada konstanta-konstanta pada program. Pada baris 17-19, nilai rpc diberikan konstanta GAIN
dan ro diberikan pada konstanta OFFSET, sedangkan nilai h diberikan pada
konstanta H_CM. public static final float GAIN = 0.002286f; public static final float OFFSET = -0.06004f; public static final float H_CM = 5f;
Lakukan perputaran pada baris 86-149 untuk setiap daerah dan pendengar yang dibuat untuk mendapatkan lokasi piksel yang paling terang berdasarkan komposisi nilai RGB (Red-Green-Blue). Nilai terendah dari tr,tg dan tb adalah 0, sedangkan nilai tertinggi adalah 255. Biasanya proyeksi berkas laser yang ditangkap kamera web berwarna putih, meskipun berkas tersebut berwarna merah terang. Nilai tr,tg, dan tb disimpan
46
untuk dibandingkan dengan nilai tr,tg dan tb pada posisi piksel berikutnya. Jika nilai lebih besar maka akan disimpan pada maxtr, maxtg, dan maxtb. Resolusi gambar yang digunakan adalah 640 x 480. proses tersebut berulang hingga piksel pada daerah sudah selesai semuanya dipindai, dapat dilihat kode 4.2.
Kode 4.2. Proses untuk dibandingkan dengan nilai tr,tg dan tb. 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
for(int ii=ry; ii
Math.abs(maxtr) && Math.abs(tg) > Math.abs(maxtg) && Math.abs(tb) > Math.abs(maxtb) ) { if (tr >= LIGHT_THRESHOLD && tg >= LIGHT_THRESHOLD && tr >= LIGHT_THRESHOLD) { maxtr = tr; maxtg = tg; maxtb = tb; yPos = ii; xPos = jj; } } } }
Penghitungan jarak Variabel yPos dan xPos menyimpan berkas laser pada daerah. Jika nilai xPos dan yPos
lebih besar dari 0,maka program akan menghitung jarak, range berdasarkan
nilai pfc, ro(OFFSET), dan rfc (GAIN) yang diperoleh dari pengukuran. Informasi jarak tersebut kemudian akan ditampilkan pada layar. if (xPos > 0 && yPos > 0) { // menghitung jarak untuk titik laser pada tengah layar int pfc = 240 - yPos; // Menghitung jarak dalam cm berdasarkan parameters calibrated range = (int) (H_CM / Math.tan(pfc * GAIN + OFFSET)); // System.out.println("xPos:" + xPos + ", yPos:" + yPos + " ,range:" + range); Font.println("+:" + range, Font.FONT_6x11, xPos, yPos, (byte) 255,(byte) 0,(byte) 0, outBuffer); } else range = 0; }
47
4.1.2 Implementasi Sistem Implementasi pada sistem monitoring ruangan berbasis LRF dilakukan pada ruangan berukuran 4 m x 6 m. Posisi kamera disesuaikan untuk dapat menangkap proyeksi berkas sinar laser pada target dan diletakan pada dudukan yang dapat berotasi pada sumbunya1 untuk memperluas area pemindaian.
Simoru Kamera & Laser
Pintu
Pintu
Jendela
Jendela
: Berkas Laser
Gambar 4.1 Skema ruangan implementasi aplikasi
Perlu diperhatikan penempatan kamera dan laser penunjuk juga harus disesuaikan tinggi rendahnya dudukan karena bisa saja obyek-obyek lain seperti binatang peliharaan juga akan melintas berkas sinar laser, ataupun penyusup yang melewati diatas atau di bawah berkas sinar laser.
1
Sudut pergerakan rotasi dapat diatur sesuai kebutuhan pengguna.
48
Gambar 4.2 Foto ruang implementasi sistem
Jika semuanya berjalan dengan baik, maka program akan menampilkan gambar yang ditangkap oleh kamera web. Sebelumnya aplikasi akan memetakan informasi jarak terlebih dahulu. Selama pemetaan berlangsung, posisi pintu utama dan jendela dalam keadaan tertutup dan tidak ada obyek yang tidak dikenali. Setelah pemetaan selesai dilakukan dan aplikasi dijalankan, jika pintu utama dalam keadaan terbuka dan memotong berkas laser, maka informasi jarak tersebut tantu akan berubah. Selanjutnya, aplikasi eksternal dapat menggunakan informasi ini sesuai dengan desain proses, yaitu apakah akan membunyikan alarm, mengirimkan pesan SMS, memanggil polisi setempat, dan lain sebaginya. Demikian pula jika di dalam ruangan terdapat penyusup yang memotong berkas laser tersebut, maka alarm pun akan berbunyi.
49
4.1.3 Tampilan Antarmuka Sebelum menjalankan aplikasi, pastikan kamera web telah terpasang dengan benar pada komputer. Jika kamera belum terpasang dengan benar, maka jika program dijalankan akan muncul pesan ’’ Could not connect to capture device. Failed to creat a datasource”. Bila berjalan dengan lancar, maka program akan tampil seperti Gambar 4.3
Gambar 4.3 Tampilan antarmuka sistem monitoring ruangan
Program hanya terdiri atas 2 (dua) menu utama, yaitu menu Sistem dan menu
Help. Menu-menu tersebut mengelompokan sub-submenu. Untuk menu Sistem terdapat submenu: - Connect, berfungsi untuk menjalankan aplikasi atau koneksi ke server. Menu ini akan tidak aktif bila telah berhasil melakukan koneksi ke server. - Disconnect, berfungsi untuk memutuskan koneksi ke server. Menu ini akan aktif bila telah melakukan koneksi ke server.
50
- Keluar, berfungsi untuk keluar dari aplikasi.
Gambar 4.4 Tampilan menu sistem dan submenu connect, disconnect dan keluar
Untuk menjalankan pilih menu Sistem > Connect untuk melakukan koneksi ke server. Tunggu beberapa saat, di mana program akan mengumpulkan statistik informasi jarak. Pastikan laser penunjuk telah dinyalakan dan proyeksi berkas laser cukup nyata untuk ditangkap oleh kamera, jika laser penunjuk belum dinyalakan atau program tidak dapat mendeteksi berkas laser pada target, maka tampil pesan seperti gambar 4.5
Gambar 4.5 Tampilan pesan tidak dapat mengenali berkas laser
51
Jika semua berjalan dengan baik, maka program akan menampilkan gambar yang ditangkap oleh kamera.
Gambar 4.6 Tampilan gambar yang ditangkap kamera dan informasi jarak
Sebelumnya aplikasi akan memetakan informasi jarak terlebih dahulu. Selama pemetaan berlangsung, posisi pintu utama dan jendela dalam keadaan tertutup dan tidak ada obyek yang tidak dikenali. Pada gambar 4.6 terdapat 1(satu) daerah yang disertai dengan informasi jarak. Apabila terdapat penyusup atau obyek yang tidak dikenali memotong proyeksi berkas laser tersebut, maka informasi jarak tersebut akan berubah. Selanjutnya aplikasi eksternal dapat menggunakan informasi ini sesuai dengan desain proses, yaitu apakah membunyikan alaram, mengirimkan pesan SMS kepada sipemilik rumah, dan lain sebagainya. Untuk menghentikan server, pilih menu Sistem > Disconnect, dan untuk keluar program pilih menu Sistem > Keluar.
52
4.2 Pengujian Pengujian dilakukan untuk mengetahui tingkat keberhasilan sistem monitoring ruangan berbasis LRF. Pengujian yang dilakukan terdiri dari: lingkup pengujian meliputi perangkat keras dan perangkat lunak, skenario pengujian, hasil pengujian dan analisa hasil pengujian.
4.2.1 Lingkup pengujian Lingkup pengujian yang dilakukan meliputi perangkat keras dan perangkat lunak.
4.2.1.1 Perangkat Keras Perangkat keras yang digunakan pada saat menjalankan aplikasi ini adalah sebagai berikut: 1. PC sebagai server
: Intel Pentium III, Prosesor 1 GHz
2. Memori
: RAM 256 MB
3. Harddisk
: 10 GB
4. Laser penunjuk
: Sebagai media pengukur jarak
5. Kamera Web
: Sebagai sensor untuk menangkap sinar laser
6. Dudukan kamera dan Laser: Sebagai penyangga dudukan kamera dan laser penunjuk yang dapat berotasi.
Hasil perakitan komponen yang dibutuhkan pada perangkat keras yang berfungsi sebagai alat sensor dapat dilihat pada gambar 4.7.
53
h = 5 cm
Gambar 4.7 Tampilan dudukan penyangga kamera web dan pointer penunjuk dengan jarak konstan h = 5 cm.
4.2.1.2 Perangkat Lunak Perangkat lunak yang diperlukan untuk dapat menjalankan aplikasi ini, terbagi menjadi 2(dua) bagian yaitu: 1. Perangkat lunak sistem operasi yang digunakan yaitu windows XP. 2. Perangkat lunak untuk aplikasi yaitu Java (J2SE versi 1.4.2), Java Media
Framework (JMF Versi 2.1.1e), Driver Kamera web Prolink PCC5020.
4.2.2 Skenario pengujian Skenario pengujian merupakan dokumen yang menjelaskan prosedur pengujian yang dilakukan, terdiri dari: 1. Pengujian program Pengujian program di lakukan untuk mengetahui apakah pengodean program yang di buat sudah sesuai dengan algoritma.
54
2. Pengujian sistem antarmuka Pengujian sistem antarmuka di lakukan untuk mengetahui apakah semua antarmuka yang dirancang sudah dapat memenuhi tujuan rancangan. 3. Pengujian perhitungan manual Pada
pengujian
perhitungan
manual
metode
yang
digunakan
adalah
membandingkan jarak yang diukur berdasarkan sinar laser yang jatuh pada objek dengan jarak yang telah dipetakan sebelumnya. Misalnya diketahui pada perhitungan manual jarak suatu objek sejauh 29.84 cm, maka jarak tersebut dapat di hitung menggunakan persamaan.
h D= tan (pfc*rpc + ro) 1. Mencari sudut aktual
θ actual = arctan
5 29.84
= 0.166018053 2. Mencari nilai rpc dan ro terlebih dahulu kita cari nilai berikut ini: pfc = pfc-(pfc_total/n_pfc)
= 103-(551 / 10) =103-(55.1) = 47.9
θ actual = θ actual - (θ actual_Total / n_θ actual = 0.166018053-(0.654480515/10)
= 0.166018053-(0.065448052) = 0.100570002
55
)
dari persamaan di atas maka dapat dicari nilai rpc dan ro: rpc = 0.100570002/47.9 = 0.002100
ro = (θ actual_Total / n_θ actual
)
- (pfc_total/n_pfc x rpc)
= (0.0654480515) – (55.1 x 0.0021) = -0.050238944
dari perhitungan di atas kita masukan kepersamaan:
5 D= tan (103*0.002100 + -0.050238944) 5 D= tan (0.166061056)
= 30.10 cm Untuk tabel data pengujian dapat dilihat pada tabel 4.1.
Tabel 4.1 Tabel data pengujian No 1
Item Kamera
Type Benar
Pengujian Kamera sudah terpasang
Hasil di harapkan Akan tampilan layar antarmuka sistem monitoring ruangan
Salah
Kamera belum terpasang
Tampil kesalahan ’’ Could not connect to capture device. Failed to creat a datasource”
2
Laser
Benar
Penunjuk
Salah
Laser sudah dinyalakan/
Akan tampil layar antarmuka dengan
dapat mendeteksi berkas
menampilkan berkas sinar laser yang
laser
ditangkap kamera
Laser belum dinyalakan/
Tampil
tidak
tersambung,
dapat
mendeteksi
berkas laser
kesalahan
dinyalakan”
56
silakan
’’Tidak tombol
dapat laser
Tabel 4.1 (lanjutan) Tabel data pengujian No 3
Item
Type
Kompilasi
Benar
Pengujian
Hasil di harapkan
Tidak terdapat kesalahan
Program
Program dapat di jalankan dan tampil layar antar muka
Salah
Terdapat kesalahan
Periksa kembali program, kemudian betulkan dan simpanlah.
4
Sistem
Benar
Koneksi ke server
Menu akan non aktif bila telah berhasil
Connect
melakukan koneksi ke server dan tampil layar antar muka. Salah
Tidak terkoneksi ke server
Periksa kamera dan laser penunjuk apakah
sudah
tersambung
dengan
benar 5
Sistem
Benar
Disconnect Salah
Memutuskan koneksi ke
Menu akan aktif bila telah berhasil
server
melakukan koneksi ke server
Tidak dapat memutuskan
Periksa sistem aplikasi
koneksi ke server 6
7
Sistem Keluar
Help
Benar
Keluar
Keluar dari program
Salah
Tidak dapat keluar
Periksa sistem aplikasi
Benar
Tampil sub menu Info
Tampilan layar
mengenai informasi
aplikasi yang dibuat Salah
Tidak dapat menampilkan
Periksa sistem aplikasi
sub menu Info 8
Perhitungan
Benar
Muncul perhitungan jarak
jarak
Perhitungan jarak akan muncul di layar berdasarkan jatuhnya berkas laser pada obyek atau penyusup.
Salah
Tidak muncul perhitungan
Tidak ada obyek yang memotong
jarak
proyeksi berkas laser atau koneksi database gagal.
9
Perbandingan
Benar
Perhitungan
perhitungan
dengan
jarak
manual
sistem
dengan
Salah
Perhitungan
jarak
sama
Sesuai dengan perhitungan manual.
perhitungan
jarak
tidak
Periksa
penempatan
posisi
laser
perhitungan
sama dengan perhitungan
penunjuk apakah tidak pararel dengan
manual
manual
sumbu kamera, nilai dari h (jarak konstan antara laser penunjuk dan kamera) adalah 5 cm
57
Tabel 4.1 (lanjutan) Tabel data pengujian No 10
Item Lokasi
sinar
Type
Pengujian
Hasil di harapkan
Benar
Sinar laser jatuh tepat pada
Berkas sinar laser yang jatuh pada erea
daerah
tersebut akan dihitung informasi jarak
laser jatuh
yang
yang
ditentukan
berbentuk
persegi
yang diperoleh.
panjang. Salah
Sinar laser jatuh di luar
Sinar laser jatuh di luar daerah yang
daerah yang ditentukan.
ditentukan
maka
program
akan
mengabaikannya. 11
Pencahayaan
Benar
pada lingkung
Intensitas cahaya ruangan
Berkas sinar laser dalam gambar yang
tidak terlalu tinggi
ditangkap kamera merupakan piksel
an di dalam
yang paling terang sehingga posisi
ruangan
berkas pada gambar dapat diketahui. Salah
Intensitas cahaya ruangan
Berkas sinar laser dalam gambar yang
terlalu tinggi
ditangkap kamera tidak menghasilkan piksel yang paling terang sehingga posisi berkas pada
gambar
tidak
diketahui.
4.2.3 Hasil pengujian Hasil pengujian disajikan dalam bentuk tabel, dapat dilihat pada tabel 4.2.
Tabel 4.2 Tabel data hasil pengujian No 1
Item
Type
Pengujian
Hasil di harapkan
Kamera
Benar
Kamera sudah terpasang
Akan
tampilan
antarmuka
layar sistem
Hasil pengujian Tampil
layar
antarmuka
monitoring ruangan Salah
Kamera belum terpasang
Tampil kesalahan
Tampil pesan
’’ Could not connect to
kesalahan
capture device. Failed to creat a datasource”
58
Tabel 4.2 (lanjutan) Tabel data hasil pengujian No 2
Item Laser
Type
Pengujian
Benar
Laser sudah dinyalakan /
Akan
dapat mendeteksi berkas
antarmuka
dengan
laser dapat
laser
menampilkan
berkas
ditangkap
Penunjuk
Hasil di harapkan
sinar
tampil
laser
Hasil pengujian
layar
yang
di
Berkas sinar
kamera
tangkap kamera Salah
3
Kompilasi
Benar
Laser belum dinyalakan
Tampil kesalahan ’’Tidak
Tampil pesan
/tidak dapat mendeteksi
dapat tersambung, silakan
kesalahan
berkas laser
tombol laser dinyalakan”
Tidak terdapat kesalahan
Program
Program
Salah
4
Sistem
Benar
Terdapat kesalahan
Koneksi ke server
Connect
dapat
di
Program
jalankan dan tampil layar
berjalan
antar muka
dengan baik
Periksa kembali program,
Program tidak
kemudian betulkan dan
dapat
simpanlah.
dijalankan
Menu akan non aktif bila
Menu dapat
telah berhasil melakukan
dijalankan
koneksi ke server dan tampil layar antar muka. Salah
Tidak
terkoneksi
ke
Periksa kamera dan laser
Menu tidak
penunjuk apakah sudah
dapat
tersambung dengan benar
dijalankan
Memutuskan koneksi ke
Menu akan aktif bila
Menu dapat
server
telah berhasil melakukan
dijalankan
server
5
Sistem
Benar
Disconnect
koneksi ke server Salah
Tidak dapat memutus-
Periksa sistem aplikasi
kan koneksi ke server
Menu tidak dapat dijalankan
6
Sistem
Benar
Keluar
Keluar dari program
Keluar
Menu dapat dijalankan
Salah
Tidak dapat keluar
Periksa sistem aplikasi
Menu tidak dapat dijalankan
59
Tabel 4.2 (lanjutan) Tabel data hasil pengujian No 7
Item
Type
Help
Benar
Pengujian Tampil
sub
Hasil di harapkan
menu
Info
Hasil pengujian
Tampilan layar mengenai
Menu dapat
informasi aplikasi yang
dijalankan
dibuat Salah
8
Perhitungan
Benar
jarak
Tidak dapat
Periksa sistem aplikasi
Menu tidak
menampil- kan sub
dapat
menu Info
dijalankan
Muncul perhitungan
Perhitungan jarak akan
Perhitungan
jarak
muncul di layar berdasar
jarak tampil di
kan jatuhnya berkas laser
layar
pada
obyek
atau
penyusup. Sesuai dengan perhitungan manual. Salah
Tidak
muncul
informasi jarak
Tidak ada obyek yang
Perhitungan
memotong
jarak tidak
proyeksi
berkas laser atau koneksi
tampil di layar
database gagal. 9
Perbandingan
Benar
Perhitungan
jarak
Sesuai dengan perhitung -
Perhitungan
dengan
an manual misalnya jarak
jarak manual
manual 30.10 cm maka
maupun
dengan
pada
sistem sama.
perhitungan
dijalankan
manual
tampil juga sama.
perhitungan
sama
jarak
perhitungan manual
sistem
Salah
Perhitungan
jarak
saat jarak
Periksa
tidak sama dengan
posisi
perhitungan manual
apakah
sistem yang
penempatan laser tidak
penunjuk pararel
Perhitungan jarak tidak sama
dengan sumbu kamera, nilai dari h (jarak konstan antara laser penunjuk dan kamera) adalah 5 cm 10
Lokasi
sinar
laser jatuh
Benar
Sinar
jatuh
Berkas sinar laser yang
Sinar laser
daerah
jatuh pada area tersebut
jatuh pada
yang
ditentukan
akan dihitung informasi
area yang
yang
berbentuk
jarak yang diperoleh.
sudah
tepat
laser pada
persegi panjang.
ditentukan
60
Tabel 4.2 (lanjutan) Tabel data hasil pengujian No
Item
Type
Pengujian
Hasil di harapkan
Salah
Sinar laser jatuh di
Sinar laser jatuh di luar
Sinar laser
luar daerah yang
daerah yang ditentukan
tidak jatuh
ditentukan.
maka
pada area yang
program
akan
mengabaikannya.
Hasil pengujian
sudah ditentukan maka program mengabaikannya
11
Pencahayaan
Benar
Intensitas
cahaya
Berkas sinar laser dalam
Berkas sinar
tidak
gambar yang ditangkap
laser dapat
kamera merupakan piksel
ditangkap
yang
terang
kamera dan
posisi
berkas
merupakan
gambar
dapat
piksel yang
pada lingkungan
ruangan
di dalam ruangan
terlalu tinggi
paling
sehingga pada
Salah
diketahui.
palaing terang
Intensitas
cahaya
Berkas sinar laser dalam
Berkas sinar
ruangan
terlalu
gambar yang ditangkap
laser tidak
kamera tidak menghasil
dapat
kan piksel yang paling
ditangkap
terang
kamera
tinggi
sehingga
posisi
berkas pada gambar tidak diketahui.
4.2.4 Analisa Hasil Pengujian Setelah mengamati kerja sistem dari sistem monitoring ruangan berbasis LRF pada program ini, maka dapat di tarik suatu kesimpulan dari kegiatan tersebut antara lain: 1. Kamera yang digunakan yaitu kamera web Prolink PCC5020, jika kamera sudah terpasang dengan benar maka akan menampilkan layar antarmuka sistem monitoring ruangan, jika belum terpasang maka tampil kesalahan ’’Could not
61
connect to capture device. Failed to creat a datasource”. Untuk menghasilkan keluaran yang dibutuhkan maka sambungkan kabel kamera ke PC. 2. Laser penunjuk yang digunakan jika sudah dinyalakan / dapat mendeteksi berkas laser maka akan menampilkan layar antarmuka dengan menampilkan gambar yang ditangkap kamera. Jika laser penunjuk belum dinyalakan atau tidak dapat mendeteksi berkas laser maka tampil kesalahan ’’Tidak dapat tersambung, silakan tombol laser dinyalakan”. Perlu diperhatikan adalah proyeksi berkas sinar laser tersebut harus dapat ditangkap oleh kamera, karena program menggunakan algoritma mencari piksel yang paling terang berdasarkan komposisi nilai RGB (Red-Green-Blue) sehingga sumber cahaya lain seperti lampu harus diatur sedemikian rupa agar proyeksi berkas laser merupakan piksel yang paling terang. 3. Kompilasi program. Setelah kode sumber misalnya SimoruLRF.java disimpan, program tersebut perlu dikompilasi terlebih dahulu. Perintah yang digunakan: Javac
SimoruLRF.java
perintah tersebut akan mengkompilasi program
Dalam
hal ini kompiler javac akan menghasilkan berkas
SimoruLRF.java.
bernama SimoruLRF.class. Jika ada kesalahan (ada pesan pada layar) sewaktu mengkompilasi, bukalah kembali program tersebut dan kemudian betulkan, serta simpanlah. Selanjutnya kompilasi kembali sampai tidak ada kesalahan. 4. Setiap menu dan submenu connect, disconnect, keluar dan help yang telah dilakukan pengujian kebenaran logika, sesuai dengan tujuan yaitu menghasilkan keluaran yang dibutuhkan. Jika pengguna memanggil menu-menu yang ada maka program akan menampilkan informasi yang dipilih.
62
5. Perhitungan jarak jika benar akan muncul di layar berdasarkan jatuhnya berkas laser pada obyek atau penyusup. Jika tidak muncul informasi jarak maka tidak ada obyek yang memotong proyeksi berkas laser atau koneksi database gagal. 6. Perhitungan jarak dibandingkan dengan perhitungan manual sudah sesuai, namun bisa saja tidak sesuai di karenakan penempatan posisi laser penunjuk tidak pararel dengan sumbu kamera, dalam hal ini nilai dari h (jarak konstan antara laser penunjuk dan kamera) adalah 5 cm, dapat dilihat pada gambar 4.7. 7. Berkas sinar laser jatuh tepat pada daerah yang ditentukan yang berbentuk persegi panjang maka program akan memperhitungkan informasi jarak yang diperoleh namun jika sebaliknya maka program akan mengabaikannya. 8. Pencahayaan lingkungan di dalam ruangan yang digunakan diusahakan tidak terlalu tinggi hal ini disebabkan karena gambar yang ditangkap oleh kamera akan diolah oleh algoritma program berdasarkan piksel yang paling terang sehingga posisi berkas pada gambar dapat diketahui. 9. Pengujian aplikasi sistem monitoring ruangan berbasis LRF dapat digunakan sesuai dengan tujuan yaitu sistem secara keseluruhan dapat memenuhi kebutuhan pengguna.
63
BAB V KESIMPULAN DAN SARAN
5.1 Kesimpulan Dengan melihat hasil pengamatan dan pembahasan dari implementasi dan pengujian sistem monitoring ruangan berbasis LRF, maka dapat menyimpulkan beberapa hal sebagai berikut: 1. Untuk mendapatkan lokasi piksel yang paling terang maka dibuat satu area yang berbentuk persegi panjang, berkas sinar laser yang jatuh tepat pada daerah yang ditentukan tersebut maka program akan membandingkan jarak yang di ukur berdasarkan sinar laser yang jatuh pada objek dengan jarak yang telah dipetakan sebelumnya. Apabila terdapat perbedaan jarak, maka dapat diasumsikan adanya objek yang menghalangi berkas sinar laser tersebut, namun sebaliknya jika berkas sinar laser jatuh di luar daerah yang telah ditentukan maka program akan mengabaikannya. Jika program tidak berhasil menemukan piksel yang paling terang dengan asumsi laser pointer belum dinyalakan, maka program akan memberikan peringatan. 2. Hasil dari proses kalibrasi ditampilkan sebagai vector keluaran. Saat melakukan proses kalibrasi dan penyusup dikenali, hasilnya akan ditampilkan
64
di vector keluaran tersebut. Sistem akan menampilkan koordinat layar yang berguna untuk perhitungan jarak. 3.
Hasil kurang akurat untuk objek-objek yang kurang dapat memantulkan berkas sinar laser yang ditembakan. Sistem cocok dipakai jika monitoring dilakukan pada lingkungan di dalam ruangan dengan intensitas cahaya lingkungan yang tidak terlalu tinggi.
5.2 Saran Perancangan sistem ini masih dapat dikembangkan menjadi suatu sistem yang lebih komplek yaitu penggunaan sumber laser yang tidak kasat mata, penggunaan kamera web / sensor optik yang dapat mendeteksi keberadaan berkas laser yang tidak kasat mata tersebut, hingga proyeksi sinar laser yang berupa garis / area bukan titik sehingga area pengawasan menjadi lebih luas. Hal ini sekiranya perlu dilakukan jika sistem monitoring juga akan dipakai di sektor lainnya.
65
DAFTAR PUSTAKA
Cahyono, Setiyo. 2006. Panduan Praktis Pemrograman Database Menggunakan
MySQL dan Java. Bandung: Informatika. Danko, Todd. 2002. Webcam based DIY Laser Rangefinder. Belgium: Drexel University. Dalam situs di lihat pada tanggal 24 April 2008. http://www.pages.drexel.edu/~twd25/webcam_laser_ranger.html Gunawan, Ferry. 2005. Seri Penuntun Praktis Membuat Sistem Pendeteksi Ruangan
dengan Sinar Laser. Jakarta: Elex Media Komputindo. Kadir, Abdul. 2004. Dasar Pemrograman Java 2 edisi II. Yogyakarta: Andi. Sommervile, Ian. 2003. Software engineering (Rekayasa perangkat lunak) edisi 6.
jilid 1. Jakarta: Erlangga. Lejos Vision System. http://homepage.ntlworld.com/lawrie.griffiths/vision.html http://java.sun.com http://lejos.sourceforge.net http://mysql.com
66
LAMPIRAN – LAMPIRAN
// Membuat set judul Vision.startViewer("Sistem Monitoring Ruangan Berbasis LRF");
// Berkas : SimoruLRF.java // Sistem Monitoring Ruangan Berbasis LRF import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.event.*; import java.io.*; import java.util.*; import java.text.*;
// Menu tool bar menubar = new JMenuBar(); menubar.add(createMenu("Sistem")); menubar.add(createMenu("Help")); // Memberi frame Frame visionFrame = Vision.getFrame();
public class SimoruLRF implements ColorListener { static private JMenuBar menubar = null; static private JMenuItem menuItem_Connect = null; static private JMenuItem menuItem_Disconnect = null; static private JMenuItem menuItem_Keluar = null; static private JMenuItem menuItem_garis = null; static private JMenuItem menuItem_Info = null; static private JOptionPane optionPane = null;
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension mySize = visionFrame.getSize();
static private int range = 0; static private int CalibrateRange = 0; static private boolean GetCheck = false; static private boolean doRun = true; static private Vector vec = new Vector(); static private java.util.Date currentDate = new java.util.Date();
visionFrame.add("North", menubar); visionFrame.pack(); visionFrame.setVisible(true); }
visionFrame.setLocation((screenSize.width mySize.width) / 2, (screenSize.height mySize.height) / 2); // Disconnect pertama Vision.p.stop();
private static JMenu createMenu(String title) { Menu menu = new JMenu(); menu.setText(title);
static private DBConnection db = null; static private SimpleDateFormat sdf = null;
//Menambah "Sistem" toolbar if (title.equals("Sistem")) { menu.setMnemonic(KeyEvent.VK_S); menu.add(createItem("Connect")); menu.add(createItem("Disconnect")); menu.add(createItem("---------------")); menu.add(createItem("Keluar")); }
public SimoruLRF () { pTimer m_pTimer = new pTimer(); m_pTimer.start(); } public void colorDetected(int region, int color) {} public static void main(String [] args) { sdf = new SimpleDateFormat("yyMMddHHmmssS");
//Menambah "Help" toolbar if (title.equals("Help")) { menu.setMnemonic(KeyEvent.VK_H); menu.add(createItem("Info")); } return menu; }
// Inisial database db = new DBConnection(); // Membuat hal kelas untuk pendengar SimoruLRF listener = new SimoruLRF();
private static JMenuItem createItem(String title) { JMenuItem menuItem = new JMenuItem(title);
// Membuat 1 daerah dan set mereka untuk melihat piksel yang paling terang Vision.addRectRegion(1, 160, 0, 320, 480); Vision.addColorListener(1, listener, 0);
//Menambah "Connect" sub-toolbar if (title.equals("Connect")) {
67
-
68
vec.setSize(0); menuItem.setMnemonic(KeyEvent.VK_C); menuItem.getAccessibleContext().setAccessibleDes cription("Connect"); menuItem_Connect = menuItem; //menuItem.setIcon(new ImageIcon(filepath + "images" + System.getProperty("file.separator") + "connect1.gif")); } //Menambah "Disconnect" sub-toolbar else if (title.equals("Disconnect")) { menuItem.setMnemonic(KeyEvent.VK_D);
while(doRun){ try { if(f>=100) doRun = false; if(vec.isEmpty()) vec.addElement(Integer.toString(range)); else { for(int g=0; g
menuItem.getAccessibleContext().setAccessibleDes cription("Disconnect"); menuItem_Disconnect = menuItem; menuItem.setEnabled(false); //menuItem.setIcon(new ImageIcon(filepath + "images" + System.getProperty("file.separator") + "disconnect1.gif")); }
break; } else
//Menambah "Keluar" sub-toolbar else if (title.equals("Keluar")) {
vec.addElement(Integer.toString(range));
menuItem.setMnemonic(KeyEvent.VK_K); menuItem.getAccessibleContext().setAccessibleDes cription("Keluar"); menuItem_Keluar = menuItem; //menuItem.setIcon(new ImageIcon(filepath + "images" + System.getProperty("file.separator") + "exit.gif")); } //Menambah "Info" sub-toolbar else if (title.equals("Info")) { menuItem.setMnemonic(KeyEvent.VK_I); menuItem.getAccessibleContext().setAccessibleDes cription("Info"); menuItem_Info = menuItem; //menuItem.setIcon(new ImageIcon(filepath + "images" + System.getProperty("file.separator") + "VersionInfo.gif")); } menuItem.addActionListener(createActionListener(t itle)); return menuItem; } private static boolean doCalibrate() { int f = 0; boolean added = false; GetCheck = false; doRun = true; vec.removeAllElements();
added = true; } if(added) {
added = false; } } f++; Thread tclr = Thread.currentThread(); tclr.sleep(100); } catch (InterruptedException ie) { return false; } } if(vec.size() <= 1) { if(Integer.parseInt( (String) vec.elementAt(0))==0) { JOptionPane.showMessageDialog(optionPane,"Ti dak Dapat Tersambung, Silakan Tombol Laser dinyalakan", "Kesalahan", JOptionPane.INFORMATION_MESSAGE); Vision.p.stop(); } else GetCheck = true; } else GetCheck = true; return GetCheck; } private static ActionListener createActionListener (String s) { ActionListener a = null; if (s.equals("Connect")) {
69
a = new ActionListener() { public void actionPerformed(ActionEvent ae) { Vision.p.start(); if(doCalibrate()) { menuItem_Connect.setEnabled(false); menuItem_Disconnect.setEnabled(true); } } }; } else if (s.equals("Disconnect")) { a = new ActionListener() { public void actionPerformed(ActionEvent ae) { GetCheck = false; Vision.p.stop(); menuItem_Connect.setEnabled(true); menuItem_Disconnect.setEnabled(false); } } else if (s.equals("Keluar")) { a = new ActionListener() { public void actionPerformed(ActionEvent ae) { Vision.p.close(); System.exit(0); } }; } else if (s.equals("Info")) { a = new ActionListener() { public void actionPerformed(ActionEvent ae) { JOptionPane.showMessageDialog(optionPane, "Sistem Monitoring Ruangan Berbasis LRF. (C) Budi Santoso ver 1.0, Agustus 2008", "Info", JOptionPane.INFORMATION_MESSAGE); } }; } return a; }
// Menggunakan Thread untuk mendapat range informasi jarak class pTimer extends Thread { boolean alert = false; int d = 0;
public synchronized void run() { while(true){ try { Thread t = Thread.currentThread(); t.sleep(10); range = Vision.getRange(); if(GetCheck) { for(int h=0; h < vec.size(); h++) { d = Integer.parseInt( (String) vec.elementAt(h)); if(d==range && range!=0) { alert = false; break; } else alert = true; } if (alert) { System.out.println("Peringatan Terdeteksi");
:
Penyusup
//Update Status tabel, set flag = 1 try { db.sqlUpdate("Update STATUS set STATUS=' 1' , TIMESTAMP=" + sdf.format(currentDate)); } catch(Exception xx) {xx.printStackTrace();} } else { System.out.println("OK !"); // Update Status tabel, set flag = 0 try { db.sqlUpdate("Update STATUS set STATUS=' 0' , TIMESTAMP=" + sdf.format(currentDate)); } catch (Exception xx){xx.printStackTrace();} } } } catch (InterruptedException ie) { return; } } } } }
70
// Berkas : ColorEffect.java // Sistem Monitoring Ruangan Berbasis LRF import java.awt.*; import java.awt.image.*; import javax.media.*; import javax.media.control.*; import javax.media.format.*; import javax.media.protocol.*; import javax.media.util.*; /* * Mendukung mendeteksi warna dan cahaya dalam region * */ public class ColorEffect extends VisionEffect { public static final float GAIN = 0.002286f; public static final float OFFSET = -0.06004f; public static final float H_CM = 5f; private static final int INIT_PIXEL_THRESHOLD = 16; private static final int LIGHT_THRESHOLD = 192; public static final int MAX_PIXEL_THRESHOLD = 40; public static final int MIN_PIXEL_THRESHOLD = 0; public static final int PIXEL_THRESHOLD_INC = 4; public static final float INIT_PROPORTION = 0.25f; public static final float MAX_PROPORTION = 0.5f; public static final float MIN_PROPORTION = 0.05f; public static final float PROPORTION_INC = 0.05f; public int [] averageRed int[Region.MAX_REGIONS]; public int [] averageGreen int[Region.MAX_REGIONS]; public int [] averageBlue int[Region.MAX_REGIONS];
=
new
=
new
=
new
/* * Untuk melihat warna regions, dan jika terdapat, memanggil menggabungkan warna listener. * Juga untuk melihat akhir semua nilai cahaya dan memanggil menggabungkan cahaya Listener. * Mengkopi kedalam keluaran. */ public int process(Buffer inBuffer, Buffer outBuffer) { int outputDataLength = ((VideoFormat)outputFormat).getMaxDataLength() ; validateByteArraySize(outBuffer, outputDataLength); outBuffer.setLength(outputDataLength); outBuffer.setFormat(outputFormat); outBuffer.setFlags(inBuffer.getFlags()); byte [] inData = (byte[]) inBuffer.getData(); byte [] outData = (byte[]) outBuffer.getData(); RGBFormat vfIn = inBuffer.getFormat(); Dimension sizeIn = vfIn.getSize();
(RGBFormat)
int pixStrideIn = vfIn.getPixelStride(); int lineStrideIn = vfIn.getLineStride(); if ( outData.length < sizeIn.width*sizeIn.height*3 ) { System.out.println("Buffer tidak penuh"); return BUFFER_PROCESSED_FAILED; }
System.arraycopy(inData,0,outData,0,inData.length ); // Mencari Region Region [] regions = Vision.getRegions(); // Melihat warna pada listeners
public static int pixelThreshold INIT_PIXEL_THRESHOLD; public static float requiredProportion INIT_PROPORTION;
=
// Memeriksa masing-masing non-null region int bestRegion = -1; int bestListener = -1; float bestProportion = -1;
= for(int i=0;i
public int range = 0; /* * Mendeteksi warna dan cahaya dalam region */ public ColorEffect() { super(); }
// Mencari warna listeners untuk region ini ColorListener [] cl = regions[i].getColorListeners(); // dilanjutkan jika bukan listeners if (cl.length == 0) continue; // mendapatkan ukuran region int rx = regions[i].getX();
71
int ry = regions[i].getY(); int width = regions[i].getWidth(); int height = regions[i].getHeight(); int maxtr = 0; int maxtg = 0; int maxtb = 0; // melihat untuk menggabungkan warna pada masing-masing listener for(int j=0;j Math.abs(maxtr) && Math.abs(tg) > Math.abs(maxtg) && Math.abs(tb) > Math.abs(maxtb) ) { if (tr >= LIGHT_THRESHOLD && tg >= LIGHT_THRESHOLD && tr >= LIGHT_THRESHOLD) { maxtr = tr; maxtg = tg; maxtb = tb; yPos = ii; xPos = jj;
} } } } if (xPos > 0 && yPos > 0) { // menghitung jarak untuk titik laser pada tengah layar int pfc = 240 - yPos; // Menghitung jarak dalam cm berdasarkan parameters kalibrasi range = (int) (H_CM / Math.tan(pfc * GAIN + OFFSET)); System.out.println("xPos:" + xPos + ", yPos:" + yPos + " ,range:" + range); Font.println("+:" + range, Font.FONT_6x11, xPos, yPos, (byte) 255,(byte) 0,(byte) 0, outBuffer); } else range = 0; } } } return BUFFER_PROCESSED_OK; } /* * Mengambil nama Effect * @return "Color Effect" */ public String getName() { return "Color Effect"; } }
72
//Berkas : MotionDetectionEffect.Java /* * Author: Konrad Rzeszutek * * This code is freely distributed. You can use as you want. */ import javax.media.*; import javax.media.format.*; import java.awt.*; import java.io.*; /** * Motion detection effect. * * The engine has two steps. * First the input image and the * reference image (which is the image from the previous frame) is compared. * Whenever a pixel has changed consideribly (determined by the * threshold variable) a internal blackwhite-red image is * marked (at the same exact location where the change occured). Therefore in * the first step, the internal black-white-red image is has lit up clusters * in the space where a change has occured. * The next step is to eliminate these clusters that are too small, but still * appeared in our black-white-red image. Only the big clusters are left (and * are colored red). During this process we keep a track of couunt of the big * clusters. * If the count is greater than blob_threshold then the input frame is * determined to have consideribly motion as to the previous frame. * *
Many of the ideas have been taken from *
* - A Gnome Security Camera by * Lawrance P. Glaister. *
- Digital Image Processing by Kenneth R. Castleman; ISBN 0-13-211467-4 *
- Computer Graphics Principles and Practice by Foley, van Dam, Feiner, * Hughes; ISBN 0-201-84840-6 *
- Java Media Format Sample Programs (mainly the one dealing with * building an Effect plugin) *
* *
* @author : Konrad Rzeszutek
* * Modified by Lawrie Griffiths to fit in with lejos vision system. */ public class MotionDetectionEffect extends VisionEffect { private int [] blobCount = new int[Region.MAX_REGIONS]; /** * Optimization. Anything above 0 turns it on. By default its * disabled. */ public int OPTIMIZATION = 0; /** * Maximum threshold setting. Setting the threshold above this * means to get the motion detection to pass the frame you pretty * much have to full the whole frame with lots of motions (ie: drop * the camera) */ public int THRESHOLD_MAX = 10000; /** * By what value you should increment. */ public int THRESHOLD_INC = 1000; /** * The initial threshold setting. */ public int THRESHOLD_INIT = 1000; private byte[] refData; private byte[] bwData; private int avg_ref_intensity; private int avg_img_intensity; /** * The threshold for determing if the pixel at a certain location has * changed consideribly. */ public int threshold = 10; /** * Our threshold for determinig if the input image has enough motion. * */ public int blob_threshold = THRESHOLD_INIT; /** * Turn debugging on. Slows down the effect but shows how motion * detection effect works.
73
*/ public boolean debug = false; /** * Initialize the Motion effect plugin. */ public MotionDetectionEffect() { super(); } /** * Process the image, detecting motion in the regions * @param inBuffer the input Buffer * @param outBuffer the output Buffer * @return BUFFER_PROCESSED_OK or BUFFER_PROCESSED_FAILED */ public int process(Buffer inBuffer, Buffer outBuffer) { /* Optimization ideas:
int y, x; // Get the input demensions int width = sizeIn.width; int height = sizeIn.height; int r,g,b; int ip, op; byte result; int avg = 0; int refDataInt = 0; int inDataInt = 0; int correction; // If a snapshot has been requested, write the JPEG image to the selected file
- then do all the calculation on int[][] array instead of masking the bits.
if (Vision.takeSnapshot()) { try { Vision.writeImage(Vision.snapshotFilename, inData, Vision.imageWidth, Vision.imageHeight); } catch (Exception e) { System.out.println("Gagal Untuk Mengambil Pemotretan"); } finally { Vision.setSnapshot(false); } }
Furthermore, only do the comparison every 5 frames instead of every frame. */
// If we have no reference data, create it, copy input to output // and don' t attempt to detect motion
// Validate and create the necessary buffers
if (refData == null) { refData = new byte[outputDataLength]; bwData = new byte[outputDataLength];
- first scale down the image. - convert the image to an int[][] array (instead of using byte[][])
int outputDataLength = ((VideoFormat)outputFormat).getMaxDataLength() ; validateByteArraySize(outBuffer, outputDataLength); outBuffer.setLength(outputDataLength); outBuffer.setFormat(outputFormat); outBuffer.setFlags(inBuffer.getFlags());
System.arraycopy (inData,0,refData,0,inData.length); System.arraycopy(inData,0,outData,0,inData.length ); for (ip = 0; ip < outputDataLength; ip++) { avg += (int) (refData[ip] & 0xFF); }
// Get the data portion of the buffers byte [] inData = (byte[]) inBuffer.getData(); byte [] outData = (byte[]) outBuffer.getData();
avg_ref_intensity = avg / outputDataLength; return BUFFER_PROCESSED_OK; }
// Get the input format
// Check the output buffer
RGBFormat vfIn = (RGBFormat) inBuffer.getFormat(); Dimension sizeIn = vfIn.getSize();
if ( outData.length < sizeIn.width*sizeIn.height*3 ) { System.out.println("Buffer tidak penuh"); return BUFFER_PROCESSED_FAILED; }
// Get the stride lengths int pixStrideIn = vfIn.getPixelStride(); int lineStrideIn = vfIn.getLineStride();
// Calculate the average intensity
74
for (ip = 0; ip < outputDataLength; ip++) { avg += (int) (inData[ip] & 0xFF); } avg_img_intensity = avg / outputDataLength; // Calculate the correction factor as the absolute value of // the difference between the image and the reference integrity correction = (avg_ref_intensity < avg_img_intensity) ? avg_img_intensity - avg_ref_intensity : avg_ref_intensity - avg_img_intensity;
} else { bwData[op++] = (byte)result; bwData[op++] = (byte)result; bwData[op++] = (byte)result; } } // Now eliminate insignificant blobs and count how many // there are in each region Region [] regions = Vision.getRegions(); for(int i=0;i
// System.out.println(avg_ref_intensity + "; "+avg_img_intensity+" = "+correction); // avg_ref_intensity = avg_img_intensity; ip = op = 0; /** * Compare the reference frame with the new frame. * We lite up only the pixels which changed, the rest are discarded (on the * b/w image - used for determing the motion) * */ for (int ii=0; ii< outputDataLength/pixStrideIn; ii++) { refDataInt = (int) refData[ip] & 0xFF; inDataInt = (int) inData[ip++] & 0xFF; r = (refDataInt > inDataInt) ? refDataInt inDataInt : inDataInt - refDataInt; refDataInt = (int) refData[ip] & 0xFF; inDataInt = (int) inData[ip++] & 0xFF; g = (refDataInt > inDataInt) ? refDataInt inDataInt : inDataInt - refDataInt; refDataInt = (int) refData[ip] & 0xFF; inDataInt = (int) inData[ip++] & 0xFF; b = (refDataInt > inDataInt) ? refDataInt inDataInt : inDataInt - refDataInt; // intensity normalization r -= (r < correction) ? r : correction; g -= (g < correction) ? g : correction; b -= (b < correction) ? b : correction; result = (byte)(java.lang.Math.sqrt((double)( (r*r) + (g*g) + (b*b) ) / 3.0)); // black/white image now. if (result > (byte)threshold) { bwData[op++] = (byte)255; bwData[op++] = (byte)255; bwData[op++] = (byte)255;
for (op = lineStrideIn + 3; op < outputDataLength lineStrideIn-3; op+=3) { for (int i=0; i<1; i++) { if (((int)bwData[op+2] & 0xFF) < 255) break; if (((int)bwData[op+2-lineStrideIn] & 0xFF) < 255) break; if (((int)bwData[op+2+lineStrideIn] & 0xFF) < 255) break; if (((int)bwData[op+2-3] & 0xFF) < 255) break; if (((int)bwData[op+2+3] & 0xFF) < 255) break; if (((int)bwData[op+2-lineStrideIn + 3] & 0xFF) < 255) break; if (((int)bwData[op+2-lineStrideIn - 3] & 0xFF) < 255) break; if (((int)bwData[op+2+lineStrideIn - 3] & 0xFF) < 255) break; if (((int)bwData[op+2+lineStrideIn + 3] & 0xFF) < 255) break; bwData[op] = (byte)0; bwData[op+1] = (byte)0; int yy = (op/lineStrideIn); int xx = (op % lineStrideIn)/pixStrideIn; for(int j=0;j
75
// Call the motion listeners for this region // methods for interface PlugIn MotionListener [] ml = regions[i].getMotionListeners(); for(int j=0;j<ml.length;j++) ml[j].motionDetected(i+1); // If in debug mode split the screen into 4 and show the original // picture, the reference picture and the blobs detected if (debug) { sample_down(inData,outData, 0, 0,sizeIn.width, sizeIn.height, lineStrideIn, pixStrideIn); Font.println("Gambar yang Asli", Font.FONT_8x8, 0, 0, (byte)255,(byte)255,(byte)255, outBuffer); sample_down(refData,outData, 0, sizeIn.height/2,sizeIn.width, sizeIn.height, lineStrideIn, pixStrideIn); Font.println("Gambar yang di Rekomendasi", Font.FONT_8x8, 0, sizeIn.height , (byte)255,(byte)255,(byte)255, outBuffer); sample_down(bwData,outData, sizeIn.width/2, 0,sizeIn.width, sizeIn.height, lineStrideIn, pixStrideIn); Font.println("Deteksi Gerak Gambar", Font.FONT_8x8, sizeIn.width/2, 0 , (byte)255,(byte)255,(byte)255, outBuffer); } else { // Otherwise copy the input to the output
System.arraycopy(inData,0,outData,0,inData.length ); } // Whether debug or not make the current picture the new reference picture
System.arraycopy(inData,0,refData,0,inData.length ); return BUFFER_PROCESSED_OK; } } // If no motion detected, just copy the input to the output
System.arraycopy(inData,0,outData,0,inData.length ); return BUFFER_PROCESSED_OK; }
/** * get the name of the effect * @return "Motion Detection Effect" **/ public String getName() { return "Motion Detection Effect"; } private Control[] controls; /** * Getter for array on one control for adjusing motion threshold and setting debug. * @return an array of one MotionDetectionControl */ public Object[] getControls() { if (controls == null) { controls = new Control[1]; controls[0] = new MotionDetectionControl(this); } return (Object[])controls; } // Utility methods. /** * Reduce the data to one quarter size **/ void sample_down(byte[] inData, byte[] outData, int X, int Y, int width, int height, int lineStrideIn, int pixStrideIn) { int p1, p2, p3, p4, op,x,y; for ( y = 0; y < (height/2); y++) { p1 = (y * 2) * lineStrideIn ; // upper left cell p2 = p1 + pixStrideIn; // upper right cell p3 = p1 + lineStrideIn; // lower left cell p4 = p3 + pixStrideIn; // lower right cell op = lineStrideIn * y + (lineStrideIn*Y) + (X*pixStrideIn); for ( int i =0; i< (width /2 );i++) { outData[op++] = (byte)(((int)(inData[p1++] & 0xFF) + ((int)inData[p2++] & 0xFF)+ ((int)inData[p3++] & 0xFF) + ((int)inData[p4++] & 0xFF))/4); // blue cells avg outData[op++] = (byte)(((int)(inData[p1++] & 0xFF) + ((int)inData[p2++] & 0xFF)+ ((int)inData[p3++] & 0xFF) + ((int)inData[p4++] & 0xFF))/4); // blue cells avg outData[op++] = (byte)(((int)(inData[p1++] & 0xFF) + ((int)inData[p2++] & 0xFF)+ ((int)inData[p3++] & 0xFF) + ((int)inData[p4++] & 0xFF))/4); // blue cells avg p1 += 3; p2 += 3; p3+= 3; p4 += 3; } } } }
76
0, motion.THRESHOLD_MAX /
// Berkas : MotionDetectionControl.Java //Sistem Monitoring Ruangan Berbasis LRF 1000, import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.media.Control;
motion.THRESHOLD_INIT
/** * Title: Lejos Vision System * Description: Motion Detection Control * @author Konrad Rzeszutek * Modified bty Lawrie Griffiths for lejos vision system */ public class MotionDetectionControl implements Control, ActionListener, ChangeListener { private Component component; private JButton button; private JSlider threshold; private JLabel label; private MotionDetectionEffect motion; /** * Create the Motion Detection Control */ public MotionDetectionControl(MotionDetectionEffect motion) { this.motion = motion; } /** * Return the visual component * @return the component containing the GUI controls **/ public Component getControlComponent () { if (component == null) { label = new JLabel("Mengatur Gerak Ambang:"); button = new JButton("Gerak Debug"); button.addActionListener(this); button.setToolTipText("Click untuk debugging mode on/off"); threshold = JSlider(JSlider.HORIZONTAL,
/
1000);
new
threshold.setMajorTickSpacing(motion.THRESHO LD_INC / 1000); threshold.setPaintLabels(true); threshold.addChangeListener(this); Panel componentPanel = new Panel(); componentPanel.setLayout(new BorderLayout()); componentPanel.add("South", button); componentPanel.add("Center", threshold); componentPanel.add("North", label); componentPanel.invalidate(); component = componentPanel; } return component; } /** * Toggle debug * @param e the action event (ignored) **/ public void actionPerformed(ActionEvent e) { Object o = e.getSource(); if (o == button) { if (motion.debug == false) motion.debug = true; else motion.debug = false; } } /** * Set the threshold value * @param e the Changeevent (ignored) **/ public void stateChanged(ChangeEvent e) { Object o = e.getSource(); if (o == threshold) { motion.blob_threshold threshold.getValue()*1000; } } }
=
77
//Berkas : Region.Java /** * Representation of a region in the camera' s field of view * @author Lawrie Griffiths */ public class Region { public static int MAX_REGIONS = 48; private int x, y; private int w, h; private static final MAX_MOTION_LISTENERS = 48; private static final MAX_COLOR_LISTENERS = 48; private static final MAX_LIGHT_LISTENERS = 48;
int int int
private MotionListener [] motionListeners= new MotionListener[MAX_MOTION_LISTENERS]; private int numMotionListeners = 0; private ColorListener [] colorListeners= new ColorListener[MAX_COLOR_LISTENERS]; private int numColorListeners = 0; private int [] colors = new int[MAX_COLOR_LISTENERS]; private LightListener [] lightListeners= new LightListener[MAX_LIGHT_LISTENERS]; private int numLightListeners = 0; /** * Create a region * * @param x the x coordinate of the botton left corner * @param y the y coordinate of the botton left corner * @param w the width of the region * @param h the height of the region */ public Region(int x, int y, int w, int h) { this.x = x; this.y = y; this.w = w; this.h = h; } /** * Get the X coordinate of the bottom left corner */ public int getX() { return x; } /** * Get the Y coordinate of the bottom left corner
*/ public int getY() { return y; } /** * Get the width of the region * @return the width of the region */ public int getWidth() { return w; } /** * Get the height of the region * @return the height of the region */ public int getHeight() { return h; } /** * Test if point is in the region * @param tx test x coordinate * @param ty test y coordinate */ public boolean inRegion(int tx, int ty) { return (tx >=x && ty >= y && tx <=x+w && ty <= y+h); } /** * Add a motion listener * @param ml the listener to add */ public void addMotionListener(MotionListener ml) { motionListeners[numMotionListeners++] = ml; } /** * Add a color listener * @param cl the listener to add * @param color the color to look for */ public void addColorListener(ColorListener cl, int color) { colors[numColorListeners] = color; colorListeners[numColorListeners++] = cl; } /** * Add a light listener * @param ll the listener to add */ public void addLightListener(LightListener ll) { lightListeners[numLightListeners++] = ll; } /** * Return the array of motion listeners * @return the motion listener array
78
*/ public MotionListener [] getMotionListeners() { MotionListener [] ml = new MotionListener[numMotionListeners]; for(int i=0;i
/** * Return the array of colors corresponding to the color listeners * @return the array of colors */ public int [] getColors() { return colors; }
/** * Return the array of color listeners * @return the color listener array */ public ColorListener [] getColorListeners() { ColorListener [] cl = new ColorListener[numColorListeners]; for(int i=0;i
/** * Return the array of light listeners * @return the light listener array */ public LightListener [] getLightListeners() { LightListener [] ll = new LightListener[numLightListeners]; for(int i=0;i
//Berkas : Vision.java //Sistem Monitoring ruang berbais LRF
static FlipEffect flipEffect = new FlipEffect(); static RegionEffect regionEffect = new RegionEffect(); static MotionDetectionEffect motionDetectionEffect = new MotionDetectionEffect();
import java.awt.*; import java.io.*; import java.util.*; import java.awt.event.*; import javax.media.*; import javax.media.control.TrackControl; import javax.media.format.*; import javax.media.protocol.*; import javax.media.datasink.*; import javax.media.control.*; import javax.sound.sampled.*; import com.sun.image.codec.jpeg.*; import java.awt.image.*; /** * Java version of Vision Command. */ public class Vision extends Frame implements ControllerListener { // package protected fields static int imageWidth = -1, imageHeight = -1; static float frameRate = 15; static String snapshotFilename; static Processor p; static DataSource cds; static String cameraDevice, soundDevice; static boolean isRecording = false; static Recorder recorder; static boolean captureColor = false; static Vision visionFrame; static ColorEffect colorEffect = new ColorEffect();
// private instance variables private Object waitSync = new Object(); private boolean stateTransitionOK = true; private static Properties videoProperties; private final static String DEFAULT_VIDEO_DEV_NAME = "VFW:Prolink PCC5020 Camera:0"; private final static String DEFAULT_SOUND_DEV_NAME = "DirectSoundCapture"; private static Region [] regions = new Region[Region.MAX_REGIONS]; private static boolean takeSnapshot = false; /** * Create the viewer frame with a title. * @param title the title for the viewer */ public Vision(String title) { super(title); } /** * Get the viewer frame. Allows extra controls to be added. * @return the frame */ public static Frame getFrame() { return (Frame) visionFrame;
79
}
break; }
/** * Given a datasource, create a processor and use that processor * as a player to playback the media. * * During the processor' s Configured state, the FlipEffect, MotionDetectionEffect * ColorEffect and RegionEffect are inserted into the video track. * */ public boolean open(DataSource tds) { // Create a cloneable data source so that it cab be cloned for video capture cds = Manager.createCloneableDataSource(tds); // Create a processor for the capture device try { p = Manager.createProcessor(cds); } catch (Exception e) { System.err.println("Gagal untuk membuat Processor dari pemberi sumber data: " + e); return false; } // Make this Vision instance thr controller p.addControllerListener(this);
} if (videoTrack == null) { System.err.println("Masukan memuat jejak video."); return false; }
tidak
// Instantiate and set the frame access codec to the data flow path. try { Codec codec[] = { flipEffect, motionDetectionEffect, regionEffect, colorEffect}; videoTrack.setCodecChain(codec); } catch (UnsupportedPlugInException e) { System.err.println("Processor tidak mendukung effects."); return false; } // Realize the processor. p.prefetch(); if (!waitForState(p.Prefetched)) { System.err.println("Gagal untuk processor."); return false; }
// Put the Processor into configured state. p.configure(); if (!waitForState(p.Configured)) { System.err.println("Gagal untuk Processor."); return false; }
media
menyadari
// Layout the components setLayout(new BorderLayout());
konfigurasi
// Display the visual & control component if they exist. Component cc, vc;
// So I can use it as a player.
if ((vc = p.getVisualComponent()) != null) { add("Center", vc); }
p.setContentDescriptor(null); // Obtain the track controls.
if ((cc = p.getControlPanelComponent()) != null) {
TrackControl tc[] = p.getTrackControls(); if (tc == null) { System.err.println("Gagal untuk memperoleh jejak kontrol dari Processor."); return false; }
add("South", cc); } // Start the processor. p.start();
// Search for the track control for the video track.
// Show the frame
TrackControl videoTrack = null;
setVisible(true);
for (int i = 0; i < tc.length; i++) { if (tc[i].getFormat() instanceof VideoFormat) { videoTrack = tc[i];
// Detect the window close event addWindowListener(new WindowAdapter() {
80
public void windowClosing(WindowEvent we)
} else if (evt instanceof EndOfMediaEvent) { p.close(); System.out.println("Akhir dari Media"); System.exit(0); }
{ p.close(); System.exit(0); } }); // If we get here, its worked return true; } /** * Close Video viewer */ public static void stopViewer() { visionFrame.setVisible(false); p.close(); } public void addNotify() { super.addNotify(); pack(); } /** * Block until the processor has transitioned to the given state. * Return false if the transition failed. */ boolean waitForState(int state) { synchronized (waitSync) { try { while (p.getState() != state && stateTransitionOK) waitSync.wait(); } catch (Exception e) {} } return stateTransitionOK; } /** * Controller Listener. */ public void controllerUpdate(ControllerEvent evt)
} /** * Start the video viewer frame */ public static void startViewer(String title) { /* We use a properties file to allow the user to define what kind of * camera and resolution they want to use for the vision input */ String videoPropFile = System.getProperty("video.properties", "video.properties"); // Open the video properties file try { FileInputStream fis = new FileInputStream(new File(videoPropFile)); videoProperties = new Properties(); videoProperties.load(fis); } catch (IOException ioe) { System.err.println("Gagal untuk membaca property file"); System.exit(1); } // Set kamera device cameraDevice = videoProperties.getProperty("video-devicename", DEFAULT_VIDEO_DEV_NAME); // Set sound device
{
soundDevice = videoProperties.getProperty("sound-devicename", DEFAULT_SOUND_DEV_NAME);
// System.out.println(this.getClass().getName()+evt);
// Jika tidak set oleh API, set dengan lebar gambar
if (evt instanceof ConfigureCompleteEvent || evt instanceof RealizeCompleteEvent || evt instanceof PrefetchCompleteEvent) { synchronized (waitSync) { stateTransitionOK = true; waitSync.notifyAll(); } } else if (evt instanceof ResourceUnavailableEvent) { synchronized (waitSync) { stateTransitionOK = false; waitSync.notifyAll(); }
if (imageWidth < 0) imageWidth = Integer.parseInt(videoProperties.getProperty("resol ution-x", "640")); // Jika tidak set oleh API, set dengan tinggi gambar if (imageHeight < 0) imageHeight =
81
System.out.println("No format controls"); System.exit(1);
Integer.parseInt(videoProperties.getProperty("resol ution-y", "480")); System.out.println("Untuk cameraDevice + "]");
mencari
["
}
+
// Only one format control is expected for ( int i = 0; i < formatControls.length; i++ ) { if ( formatControls[i] == null ) continue;
/* Try to get the CaptureDevice that matches the name supplied by the * user */ CaptureDeviceInfo device = CaptureDeviceManager.getDevice(cameraDevice); if (device == null) { System.out.println("Tidak ada sumber kamera [ " + cameraDevice + "]"); System.exit(1); }
formatControls[i].setFormat(format); } // Create the frame visionFrame = new Vision(title); // Start the video viewer if (!visionFrame.open(tds)) System.exit(1); } /** * Play an audio file * @param fileName the audio file to play */ public static void playSound(String fileName) {
// Create a media locator from the device MediaLocator ml = device.getLocator(); // Create a data source from the media locator
// Create an Audio Stream from the file DataSource tds = null; try{ tds = Manager.createDataSource(ml); } catch (Exception e) { System.err.println("Gagal untuk membuat sumber data"); System.exit(1); } // Set the format on the relevant format control for the device // This specifies the image height, width, fram rate etc. // These need to be supported by the device. // Only 24-bit color is supported FormatControl [] formatControls ((CaptureDevice) tds).getFormatControls();
=
try { AudioInputStream stream AudioSystem.getAudioInputStream(new File(fileName)); // Get the Audio format javax.sound.sampled.AudioFormat stream.getFormat();
=
format
=
// Create a DataLine Info object DataLine.Info info = new DataLine.Info( Clip.class, stream.getFormat(), ((int)stream.getFrameLength()*format.getFrameSiz e())); // Create the audio clip Clip clip = (Clip) AudioSystem.getLine(info);
// Create the required format. Seem to need the extra 4 bytes Format format = new RGBFormat(new Dimension(imageWidth, imageHeight), (imageWidth * imageHeight * 3) + 4, Format.byteArray, frameRate, 24, 3, 2, 1, 3, Format.NOT_SPECIFIED, Format.TRUE, Format.NOT_SPECIFIED); if ( formatControls == formatControls.length == 0 ) {
null
||
// Load the audio clip - does not return until the audio file is completely loaded clip.open(stream); // Start playing clip.start(); } catch (IOException e) { System.err.println("File Audio tidak ada"); } catch (LineUnavailableException e) { System.err.println("Tidak dapat memainkan file audio"); } catch (UnsupportedAudioFileException e) {
82
System.err.println("Tidak mendukung format file Audio"); } } /** * Add a rectangular region * @param region the region number * @param x the x co-ordinate of the region bottom left corner * @param y the y co-ordinate of the region bottom left corner * @param width the width of the region * @param height the height of the region */ public static void addRectRegion(int region, int x, int y, int width, int height) { regions[region-1] = new Region(x, y, width, height); } /** * Get the array of regions * @return the array of regions */ public static Region [] getRegions() { return regions; } /** * Set the frame rate * @param rate the required frame rate */ public static void setFrameRate(float rate) { frameRate = rate; } /** * Set the size of the video viewer image * @param width the required image width * @param height the required image height */ public static void setImageSize(int width, int height) { imageWidth = width; imageHeight = height; } /** * Add a Motion Listener for the region * @param region the region * @param ml the Motion Listener */ public static void addMotionListener(int region, MotionListener ml) { regions[region-1].addMotionListener(ml); } /** * Add a Color Listener for the region * @param region the region * @param cl the Color Listener * @param color the color to listen for
*/ public static void addColorListener(int region, ColorListener cl, int color) { regions[region-1].addColorListener(cl, color); } /** * Add a Light Listener for the region * @param region the region * @param ll the Light Listener */ public static void addLightListener(int region, LightListener ll) { regions[region-1].addLightListener(ll); } /** * Return the state of the snapshot flag * @return true if a snapshot is required, else false */ static boolean takeSnapshot() { return takeSnapshot; } /** * Take a snapshot * @param filename the JPG file to write the snapshop to */ public static void snapshot(String filename) { snapshotFilename = filename; takeSnapshot = true; } /** * Set or unset the take snapshot flag * @param sanap true if snapshot is required, else false */ static void setSnapshot(boolean snap) { takeSnapshot = snap; } /** * Write to fn
file the data
using the * width, height
variables. Data is assumed to be 8bit RGB. * A JPEG format file is written. * * @param fn the filename * @param data the data to write * @param width the width of the image * @param height the height of the image * @throws FileNotFoundException if the directory/image specified is wrong * @throws IOException if there are problems reading the file. */ public static void writeImage(String fn, byte[] data, int width, int height) throws FileNotFoundException, IOException {
83
// Open the file FileOutputStream FileOutputStream(fn);
fOut
=
* Stop recording */ public static void stopRecording() { recorder.stopRecording(); }
new
// Create a JPG encoder for the file JPEGImageEncoder jpeg_encode JPEGCodec.createJPEGEncoder(fOut);
/** * Get the average red value for the region * @param region the region * @return the average red value */ public static int getAvgRed(int region) { return colorEffect.averageRed[region-1]; }
=
// Reformat the data to an array on int int ints[] = new int[data.length/3]; int k = 0; for (int i = height-1; i > 0;i--) { for (int j=0;j<width;j++) { ints[k++] = 255 << 24 | (int) (data[i*width*3 + j*3 + 2] & 0xff) << 16 | (int) (data[i*width*3 + j*3 + 1] & 0xff) << 8 | (int) (data[i*width*3 + j*3] & 0xff); } }
/** * Get the average green value for the region * @param region the region * @return the average green value */ public static int getAvgGreen(int region) { return colorEffect.averageGreen[region-1]; } /** * Get the average blue value for the region * @param region the region * @return the average blue value */ public static int getAvgBlue(int region) { return colorEffect.averageBlue[region-1]; }
// Create a buffered image BufferedImage image = new BufferedImage (width, height,BufferedImage.TYPE_INT_RGB); image.setRGB(0,0,width,height,ints,0,width); // Encode the image and close the output file jpeg_encode.encode(image); fOut.close(); } /** * Start the video recorder * @param fileName the file to write the video to * @param millis the number of milliseconds to record for. * 0 means record until stopRecoder() is called. */ public static void startRecorder(String fileName, int millis) { // Create the recorder recorder = new Recorder(fileName, millis);
/** * Get the average RGB value for the region * @param region the region * @return the average RGB value */ public static int getAvgRGB(int region) { return ((new Color(getAvgRed(region), getAvgGreen(region), getAvgBlue(region))).getRGB()) & 0xffffff; }
}
/** * Flip the image in the image viewer horizontally * @param true to flip, else false */ public static void flipHorizontal(boolean flip) { flipEffect.flip = flip; }
/** * Test is recording is in progress * @return true if recoding, else false */ public static boolean isRecording() { return isRecording; }
/** * Get range * @return the range value */ public static int getRange() { return colorEffect.range; }
// Start the video viewer recorder.start();
} /*
84
//Berkas : DBConnection.java import java.io.PrintStream; import java.sql.*; import java.sql.connection.*; import java.sql.DriverManager; import java.util.*; import org.gjt.mm.mysql.*; import java.io.*; public class DBConnection { java.sql.PreparedStatement ps; java.sql.Connection con; String error; String sql;
private String dataBase; String error_euy = "Tidak Gagal"; String dsn = ""; String user = ""; String password = ""; public DBConnection() { ps = null; con = null; error = "Tidak Gagal"; sql = "Tanpa Query"; dataBase = "LRF"; StringUtil SU = new StringUtil(); try { Class.forName ("org.gjt.mm.mysql.DriverJava"); // Class.forName ("com.mysql.jdbc.Driver"); } catch( ClassNotFoundException ee) { ee.printStackTrace(); } dsn = "Mencoba membangun connection ke : jdbc:mysql://"+SU.getString("server")+":3306/LRF "; user = SU.getString("UserID"); password = SU.getString("Password"); }
public String getError() { return error; } public void close() throws SQLException { con.close(); } private void open() throws SQLException { con = DriverManager.getConnection(dsn, user, password);
con.setAutoCommit(false); } public Vector sqlQuery() { Vector vtLine = new Vector(); try { java.sql.ResultSet rs = ps.executeQuery(); if(rs != null) { Vector vector1; try { java.sql.ResultSetMetaData rsmd = rs.getMetaData(); int colCount = rsmd.getColumnCount(); Vector vtItem; for(; rs.next(); vtLine.add(vtItem)) { vtItem = new Vector(); for(int i = 1; i <= colCount; i++) vtItem.add(rs.getString(i) != null ? ((Object) (rs.getString(i))) : ""); } rs.close(); ps.close(); Vector vector2 = vtLine; return vector2; } catch(SQLException e) { error = e.getMessage(); // System.out.println(String.valueOf(String.valueOf(( new StringBuffer("Error or in Execute SQL Command ...")).append(e).append(sql)))); vector1 = vtLine; } return vector1; } Vector vector = vtLine; return vector; } catch(SQLException e) { error = e.getMessage(); //System.out.println(String.valueOf(String.valueOf( (new StringBuffer("Error in Create Statement or in Execute SQL Command ...")).append(e).append(sql)))); } finally { // poolManager.returnConnection(dataBase, con); } return vtLine; } public int sqlUpdate (String strSQL) { int result = 0;
85
int inf =0; Vector vtLine = new Vector(); java.sql.PreparedStatement getPrepare(strSQL);
ps
=
try { result = sqlChange(); close(); } catch (Exception e ) { System.out.println(e+" ; Gagal untuk UPDATE "); } error_euy = getError(); return result; } public Vector sqlQuery(String query) { sql = query; Vector vrow = new Vector(); try { con = DriverManager.getConnection(dsn, user, password); java.sql.Statement mystm = con.createStatement(1004, 1007); java.sql.ResultSet myrst = mystm.executeQuery(query); if(myrst != null) { java.sql.ResultSetMetaData mymtdt = myrst.getMetaData(); int numcols = mymtdt.getColumnCount(); Vector vcol; for(; myrst.next(); vrow.add(vcol)) { vcol = new Vector(); for(int i = 1; i <= numcols; i++) vcol.add(myrst.getString(i)); } } mystm.close(); myrst.close(); } catch(SQLException se) { //System.out.println(String.valueOf(String.valueOf( (new StringBuffer("Error executeQuery ")).append(se).append(sql)))); error = se.toString(); } finally { try{ //mystm.close(); //myrst.close(); con.close(); }catch(Exception j){}
//poolManager.returnConnection(dataBase, con); } return vrow; } public int sqlChange() { int result = 0; try { result = ps.executeUpdate(); ps.close(); } catch(SQLException e) { error = e.getMessage(); //System.out.println(String.valueOf(String.valueOf( (new StringBuffer("Error in Create Statement, or in Execute SQL Command ...")).append(e).append(sql)))); } finally { // poolManager.returnConnection(dataBase, con); } return result; } public int sqlChange2() { int result = 0; try { result = ps.executeUpdate(); // ps.close(); } catch(SQLException e) { error = e.getMessage(); //System.out.println(String.valueOf(String.valueOf( (new StringBuffer("Error in Create Statement, or in Execute SQL Command ...")).append(e).append(sql)))); } finally { // poolManager.returnConnection(dataBase, con); } return result; } public java.sql.PreparedStatement getPrepare(String query) { try { con = DriverManager.getConnection(dsn, user, password);
86
ps = con.prepareStatement(query, 1004, 1007); sql = query; } catch(SQLException e) { error = e.getMessage(); System.out.println(String.valueOf(String.valueOf(( new StringBuffer("Gagal Membuat Statement ")).append(e).append(query)))); } return ps; }
public static void main (String [] args){ DBConnection db = new DBConnection(); Vector vlist = new Vector(); vlist = db.sqlQuery("select * from t_user"); int vlistsize = vlist.size(); if(vlistsize > 0){ for(int i = 0; i