Gtcode

You might also like

Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 4

1.

Tải các phần mềm cần thiết


- phần mềm Raspberry Pi Imager
https://www.raspberrypi.com/software/
- Phần mềm Putty
https://www.putty.org/
- Phân mềm VNC
https://www.realvnc.com/en/connect/download/viewer/
- Phần mềm IP Scanner
https://www.advanced-ip-scanner.com/

2. Format thẻ nhớ


3. Cài hệ điều hành vào thẻ nhớ
4. Tạo 1 file SSH trong folder chứa HĐH
5. Mở file wpa_supplicant, thêm tên wifi và mật khẩu
6. Cắm thẻ nhớ vào Raspberry
7. Cắp nguồn Ras, chờ 3-5 phút để Ras kết nối wifi
8. Dùng IP scanner để dò IP của Raspberry
9. Mở Putty, nhập IP của Ras
login as: pi
password: 1

sudo raspi-config
Chọn 3 Interface
Chọn P3 VNC -> Yes -> OK
Finish

10. Vào VNC -> IP Ras


Tên đăng nhập: pi
Mật khẩu: 1

11. Cài đặt cơ bản cho hệ điều hành

12 Giải thích code trong chương trình OPENCV

import cv2#Thư viện OpenCV được sử dụng để xử lý hình ảnh và video trong Python.
import imutils#Thư viện imutils cung cấp các hàm tiện ích để thực hiện các hoạt
động xử lý ảnh đơn giản hơn.
import numpy as np#Thư viện numpy được sử dụng để thao tác với các mảng đa chiều
trong Python.
import math#Thư viện math được sử dụng để tính toán các giá trị toán học trong
Python.
import controlDT#Đây là file code test cũ, code chính thức ở trong con Pi
import time#Thư viện time được sử dụng để tạm dừng chương trình trong một khoảng
thời gian nhất định.
#Tiếp theo là khởi tạo và cấu hình các thiết bị điều khiển:

cap = cv2.VideoCapture(0)#Khởi tạo một đối tượng VideoCapture với ID thiết bị là 0


(thiết bị mặc định của máy tính).
ctr = controlDT.controlDT()#Khởi tạo một đối tượng điều khiển hệ thống máy móc
thông qua module controlDT.
ctr.gaptha(0)#Điều khiển servo motor bằng hàm gaptha() để mở cửa gắp.
ctr.servoQuay(90) #Điều khiển servo motor bằng hàm servoQuay() để đưa trục quay về
vị trí ban đầu (góc 90 độ).
ctr.vegoc()#Điều khiển các trục của hệ thống máy móc để trở về gốc tọa độ.
ctr.motorON()#Bật động cơ băng tải.
#Sau đó là vòng lặp chính của chương trình:

while(True) #Khởi tạo một vòng lặp vô hạn.


_, frame = cap.read() #Đọc khung hình (frame) từ thiết bị VideoCapture và lưu vào
biến frame.
frame = imutils.rotate(frame,-3)#Xoay ảnh (frame) một góc -3 độ để hiệu chỉnh hướng
của camera.
frame = frame[115:280,0:639]#Cắt ảnh từ frame gốc với kích thước mới là 165x639
pixel, bắt đầu từ pixel (0, 115).
hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)#Chuyển đổi không gian màu từ RGB
sang HSV.
low = np.array([0,155,84]) và high = np.array([15,255,255])#Thiết lập ngưỡng giá
trị thấp và cao cho màu sắc được chọn trong không gian màu HSV.
mask = cv2.inRange(hsv_frame, low, high)#Tạo mask để loại bỏ các phần không phải
màu sắc cần tìm trong ảnh.
contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE)#Tìm các đường viền trong mask để xác định vật thể cần tìm.
for cnt in contours#Vòng lặp để duyệt qua tất cả các đường viền tìm được.
approx = cv2.approxPolyDP(cnt, 0.005*cv2.arcLength(cnt, True), True)#Xác định đường
viền xấp xỉ bằng phương pháp đa giác hóa.
(x,y,w,h) = cv2.boundingRect(approx)#Xác định hình chữ nhật bao quanh đường viền.
x0 = x+w/2 và y0 = y+h/2#Tọa độ tâm của hình chữ nhật bao quanh đường viền.
if w>50 and h>50#kiểm tra kích thước >50pixel
rect = cv2.minAreaRect(approx)# xác định vùng chữ nhật nhỏ nhất
box = cv2.boxPoints(rect)# xác định tọa độ 4 góc của hình chữ nhật
box = np.int0(box)# đổi sang số nguyên
cv2.drawContours(frame, [box],0,(0,0,255),2)# vẽ hình chữ nhật đóng
khung vật thể

if check == 1:
w = math.sqrt( ((box[1][0]-box[2][0])**2) + ((box[1][1]-box[2]
[1])**2) )
h = math.sqrt( ((box[2][0]-box[3][0])**2) + ((box[2][1]-box[3]
[1])**2) )
mins, maxs = min(w,h), max(w,h)
x1,x2,y1,y2=0,0,0,0
if w>h:
x1 = (box[0][0]+box[1][0])/2
y1 = (box[0][1]+box[1][1])/2
x2 = (box[2][0]+box[3][0])/2
y2 = (box[2][1]+box[3][1])/2
else:
x1 = (box[1][0]+box[2][0])/2
y1 = (box[1][1]+box[2][1])/2
x2 = (box[0][0]+box[3][0])/2
y2 = (box[0][1]+box[3][1])/2
if x1!=x2:
cv2.line(frame, (int(x1),int(y1)), (int(x2),int(y2)),
(0,255,0), 2)
a = (y2-y1)/(x2-x1)
b = y1 - a*x1
goc=0
if a==0:
goc=0
else:
goc = math.degrees(math.atan2((-b)/a,b))
if goc>90:
goc=goc-90
else:
goc=goc+90
ctr.servoQuay(goc)
ctr.gaptha(0) # thả
ctr.stepper(80,0,0)
ctr.stepper(280,280,280)
ctr.gaptha(1) # gắp
time.sleep(0.5)
ctr.stepper(-100,-50,-50)
ctr.servoQuay(90)
ctr.stepper(-220,0,0)
ctr.stepper(0,50,50)
ctr.stepper(200,200,200)
ctr.gaptha(0) # thả
ctr.stepper(-100,-100,-100)
ctr.stepper(0,-50,-50)
ctr.vegoc()
check = 0
x0 = 800
cap.release()
cap = cv2.VideoCapture(0)
ctr.motorON()
dem = dem + 1

if x0<400 and check==0:


ctr.motorOFF()
check = 1
cap.release()
cap = cv2.VideoCapture(0)
cv2.rectangle(frame,(0,0),(60,40),(0,255,250),-1,cv2.LINE_8)
cv2.putText(frame, str(dem), (10,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,0,255),
3, cv2.LINE_AA)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
"""
Giải Thích
Đoạn mã bên trong vòng lặp if w>h: sử dụng để tính toán tọa độ của hai điểm trung
tâm của một hình chữ nhật xoay được giới hạn bởi hàm cv2.minAreaRect() ứng với đối
tượng được phát hiện trong khung hình hiện tại. Điểm trung tâm của hình chữ nhật là
điểm giao của hai đường chéo của nó.

Nếu chiều rộng w lớn hơn chiều cao h, tức là hình chữ nhật nằm ngang, điểm trung
tâm của hai đường chéo sẽ nằm trên hai cạnh ngang của hình chữ nhật. Lúc đó, điểm
trung tâm của cạnh bên trái được tính toán bằng trung điểm của hai điểm (box[0][0],
box[0][1]) và (box[1][0], box[1][1]), điểm trung tâm của cạnh bên phải được tính
toán bằng trung điểm của hai điểm (box[2][0], box[2][1]) và (box[3][0], box[3][1]).

Ngược lại, nếu chiều rộng w nhỏ hơn hoặc bằng chiều cao h, tức là hình chữ nhật nằm
dọc, điểm trung tâm của hai đường chéo sẽ nằm trên hai cạnh dọc của hình chữ nhật.
Lúc đó, điểm trung tâm của cạnh bên trên được tính toán bằng trung điểm của hai
điểm (box[1][0], box[1][1]) và (box[2][0], box[2][1]), điểm trung tâm của cạnh bên
dưới được tính toán bằng trung điểm của hai điểm (box[0][0], box[0][1]) và (box[3]
[0], box[3][1]).

Tổng quát, đoạn mã bên trong vòng lặp này sẽ tính toán tọa độ của hai điểm trung
tâm của hình chữ nhật xoay và lưu kết quả vào biến x1, y1, x2, y2 để sử dụng trong
các xử lý tiếp theo của chương trình.

Trong đoạn mã này, nếu chiều rộng (w) của hình chữ nhật được tìm thấy lớn hơn chiều
cao (h), các điểm trung tâm của đường chéo được tính bằng cách lấy trung điểm giữa
hai đỉnh trên cùng hoặc hai đỉnh dưới cùng của hình chữ nhật. Nếu chiều cao lớn hơn
hoặc bằng chiều rộng, điểm trung tâm của đường chéo được tính bằng cách lấy trung
điểm giữa hai đỉnh kề của hình chữ nhật. Các điểm trung tâm của đường chéo này được
sử dụng để tính góc quay của servo và điều khiển robot để thực hiện việc gắp và vận
chuyển vật thể được nhận diện.
"""

# When everything done, release the capture


ctr.stepOFF()#sẽ tắt các bước điều khiển của robot, để ngừng điều khiển robot.
ctr.motorOFF()#sẽ tắt các động cơ của robot, để ngừng hoạt động của robot.
cap.release()#sẽ giải phóng tài nguyên của camera, đóng kết nối với camera.
cv2.destroyAllWindows() #sẽ đóng tất cả các cửa sổ đang hiển thị trên màn hình.

You might also like