MJPG Streamer vs Intel Galileo - Truyền hình ảnh từ webcam trong mạng LAN với Intel Galileo

I. Giới thiệu

Vấn đề truyền hình ảnh từ webcam trong mạng LAN không phải là một vấn đề mới trong việc lập trình nhúng. Ví dụ như trên Raspberry Pi, chúng ta hoàn toàn có thể sử dụng MJPG Streamer để làm được việc này. Tuy nhiên, khác với Raspberry Pi, Intel Galieo không đơn giản như vậy, bởi vì chưa có một bài viết hoàn chỉnh chỉ về vấn đề này trên cộng đồng Intel Galileo thế giới. Vì vậy, mình muốn đóng góp một phần nhỏ để các bạn có thể làm được điều này trên con Intel Galileo của mình (không phân biệt Intel Galileo Gen 1 hay Intel Galileo Gen 2 nhé).

Làm tấm ảnh demo cho nó "nguy hiểm" một tí ha devil

II. Vì sao chúng ta nên dùng MJPG streamer để stream hình ảnh từ camera?

Với kinh nghiệm của mình, ở những dự án không quá lớn và dự án đó cần truyền tải từ 01 => 03 camera thì việc xây dựng một nền tảng truyền dữ liệu riêng là không cần thiết, vì quá trình truyền tải hình ảnh không quá nặng và sẽ không gây ra tình trạng nghẽn mạng. Trong trường hợp này, chúng ta nên dùng một chương trình nguồn mở nào đó để giúp chúng ta làm việc cơ bản nhất là lấy giữ liệu từ webcam và truyền (stream) nó trong mạng. Và với kinh nghiệm của mình đã từng trải nghiệm trên nhiều máy tính nhúng như Raspberry Pi 1, 2, Intel Galileo Gen 1, 2 thì cả 4 mạch đều có thể chạy ngon lành và rất ổn định. Trong phạm vi bài viết này, mình chỉ xin giới thiệu MJPG streamer trên Intel Galileo Gen 1 và 2, còn mạch Raspberry Pi thì rất đơn giản và xin nhường cho một bạn khác viết về nó yes.

Để đơn giản hóa cho quá trình cài đặt thì mình đã build sẵn một bản chạy ổn định trên cả Intel Galileo Gen 1 và Intel Galileo Gen 2, vì vậy, các bạn chỉ việc tải về và chạy thôi à :). Ngoài ra, mình xin nói thêm về chuẩn MJPEG, đó là một chuỗi các hình ảnh liên tiếp nhau giống file gif vậy á. Nhưng kĩ thuật làm đơn giản hơn nhiều => nhanh => ứng dụng được trong việc truyền thời gian thực.

III. Cài đặt

1. Cài đặt hệ điều hành Linux Yocto

Nếu chưa cài, thì các bạn cài theo hướng dẫn tại đây.

2. Kết nối mạng

Như tiêu đề bài viết, chúng ta cần phải nối mạng cho Intel Galileo, và mạng này cần phải đi Internet được nha (chỉ là để tải source về Intel Galileo thôi mà angel). Để kết nối mạng thì có nhiều cách lắm, như là gắn dây LAN hoặc dùng mini pci driver như ở bài viết này của mình.

3. Truy cập Linux

Vì đã có mạng nên con Intel Galileo sẽ có một địa chỉ IP. Để biết được nó thì bạn vào trang quản lý modem / router và vào mục DHCP > DHCP Client list tìm địa chỉ IP nào có hostname là galileo cheeky.

Giả sử mình có địa chỉ IP là 192.168.200.68 thì mình sẽ cài đặt putty với các thông số như hình dưới.

4. Cài đặt MJPG streamer

Việc cài đặt vô cùng đơn giản, các bạn chỉ cần làm tuần tự các lệnh sau (phần phía sau dấu # các bạn không cần copy)

cd /home #chuyển về tư mục /home
wget http://k1.arduino.vn/img/2016/01/14/0/1895_123450-1452738080-0-mjpg-streamer.zip -O mjpg-streamer.zip #tải file nén các file thực thi về và lưu dưới tên mjpg-streamer.zip
unzip mjpg-streamer.zip #giải nén
mv mjpg_streamer/ /usr/bin/
cd /usr/bin/
mv mjpg_streamer/ mjpg-streamer/
mv mjpg-streamer/mjpg_streamer ./
chmod 0755 mjpg_streamer

Như vậy là bạn đã cài đặt xong.

5. Chạy thử

Để chạy được mjpg_streamer, bạn cần phải có một camera, vậy loại camera là tối ưu? Camera "tối ưu" ở đây là loại camera có hỗ trợ chuản nén mjpeg, nghĩa là bản thân camera nó đã nén mjpeg rồi, bạn không cần "nén" lại một lần nữa (thường thì camera có chuẩn YUVU - dư liệu ảnh thô chưa nén => tốn kém hơn để nén => server load cao hơn). Mình khuyên các bạn nên mua camera logitech vì nó rẻ và dùng được. Nên mua cũ từ các bạn đã làm các đồ án trước, không nên mua mới vì giá rất chát rẻ nhất cũng đã hơn 400k rồi. Nhưng mua lại như hồi mình mua có 120k mà thôi, mà mới tinh tươm (xem chất lượng hình ảnh ở trên nha :D).

Sau khi đã gắn camera thành công vào cổng USB host (với gen 2 thì gắn vô là xong còn gen 1 cần phải có một dây USB OTG gắn vào cổng usb host nữa thì mới được, dây OTG chỉ có 10k một dây hay 5k gì đó thôi à).

Để kiểm tra Intel Galileo có nhận camera của bạn hay không thì các bạn chạy một trong các lệnh sau:

Nếu bạn thích chi tiết

... thì bạn chạy lệnh

dmesg

... nó sẽ hiện ra các thông tin về các log trên hệ thống, nếu nó có một dòng đại loại như thế này thì camera của bạn đã được nhận

[   12.096583] uvcvideo: Found UVC 1.00 device Webcam C170 (046d:082b)

[   12.151799] input: Webcam C170 as /devices/pci0000:00/0000:00:14.3/usb1/1-1/1-1:1.0/input/input2

[   12.190422] usbcore: registered new interface driver uvcvideo [   12.196299] USB Video Class driver (1.1.1)

Nếu các bạn thích đơn giản

... thì chạy lệnh 

ls /dev/video*

Nếu kết quả dạng như vầy thì Intel Galileo đã nhận camera

/dev/video0 (hoặc 1, 2,...)

Và đó cũng chính là tên device (device name) mà các bạn sẽ cần đến cho câu lệnh thực thi.

Câu lệnh thực thi

mjpg_streamer -i "/usr/bin/mjpg-streamer/input_uvc.so -d /dev/video0 -quality 100 -f 30 -r 640x480" -o "/usr/bin/mjpg-streamer/output_http.so -w /usr/bin/mjpg-streamer/www -p 8080"

-d <device name - chuỗi - mặc định /dev/video0>

-quality <chất lượng - số nguyên từ 1 - 100 - mặc định 75>

-f <frame per second - số nguyên từ 1 - 60 - mặc định 10>

-r <kích thước khung hình - chuỗi (xem hướng dẫn ở dưới)>

-p <port - số nguyên - từ 1 => 216 - 1>

Từ bây giờ, bạn có thể vào địa chỉ http://<địa chỉ IP của intel galileo>::8080 để xem hình ảnh truyền trực tiếp từ camera của bạn rồi đấy. 

Để biết được các kích thức khung bình của camera, bạn chạy lệnh sau:

v4l2-ctl --list-formats-ext --device /dev/video0

--device <device name - chuỗi - mặc định là /dev/video0

Để kiểm tra xem camera của bạn có hỗ trợ MJPG không thì chạy lệnh

v4l2-ctl --list-formats --device /dev/video0 | grep MJPEG

--device <device name - chuỗi - mặc định là /dev/video0

Nếu kết quả hiện ra là thì camera của bạn đã hỗ trợ mjpeg heart

       Name        : MJPEG

6. Lỗi có thể có

Với câu lệnh mjpg... được nêu ra ở trên và một camera không hỗ trợ mjpeg thì hình ảnh stream của bạn sẽ là một màu xám xịt hoặc sẽ rất chậm. Vì vậy, các bạn hãy chạy câu lệnh dưới đây (có thêm tham số -y để báo với mjpg-streamer là bạn đang yêu cầu stream với dữ liệu thô YUVU)

 mjpg_streamer -i "/usr/bin/mjpg-streamer/input_uvc.so -d /dev/video0 -quality 80 -f 5 -r 320x240 -y" -o "/usr/bin/mjpg-streamer/output_http.so -w /usr/bin/mjpg-streamer/www -p 8080"

IV. Lời kết

Đây là một phần nhỏ trong dự án kLaserCutter và mình đã chia sẻ miễn phí nó trong kLaserCutter. Tuy nhiên, mình thấy nó rất cần thiết với Cộng đồng, vì vậy nên mình quyết định viết bài này để hướng dẫn các bạn có thể dùng được camera một cách nhanh nhất có thể. Khi dùng nó, các bạn nhớ có một dòng trong tài liệu hướng dẫn về bài viết này nhé devil.

Chúc các bạn thành công

lên
3 thành viên đã đánh giá bài viết này hữu ích.
Chuyên mục: 
Các dự án được truyền cảm hứng

Bộ điều khiển PID - ứng dụng phần 2 - xe dò line dùng thuật toán PID

Tiép nối bài viết về xe dò line cảm ơn Đỗ Hữu Toàn đã viết hộ mình phần 4. hôm nay mình sẽ làm cho chiếc xe dò line đi mượt và có hồn hơn 

lên
34 thành viên đã đánh giá bài viết này hữu ích.
Các bài viết cùng tác giả

Comments - Viết tài liệu tham khảo trong khi viết code Arduino

Bạn rất khó ghi nhớ từng dòng code một trong một chương trình thật là dài, với những thuật toán phức tạp, vì vậy Arduino đã làm cho bạn một cú pháp để giải quyết vấn đề này, đó là Comments. Comments sẽ giúp bạn ghi chú cho từng dòng code hoặc trình bày nhiệm vụ của nó để bạn hoặc những người khác có thể hiểu được chương trình này làm được những gì. Và comments sẽ không được Arduino biên dịch nên cho dù bạn viết nó dài đến đâu thì cũng không ảnh hưởng đến bộ nhớ flash của vi điều khiển. Để comments trong Arduino, bạn có 2 cách.

lên
10 thành viên đã đánh giá bài viết này hữu ích.

ESP8266 kết nối Internet - Phần 3: Arduino gặp Smartphone, hai đứa nói chuyện bằng JSON thông qua Socket

Ở bài trước, chúng ta đã biết được cách Arduino gửi dữ liệu và bị điều khiển bởi Socket Server. Hôm nay, chúng ta sẽ viết chương trình điều khiển trên Smartphone để điều khiển Arduino.

lên
20 thành viên đã đánh giá bài viết này hữu ích.