ksp gửi vào
- 25183 lượt xem
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
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ó .
Để đơ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à ). Để 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 .
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
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é .
Chúc các bạn thành công