Design Document for DATN_ROS - Đồ án tốt nghiệp đề tài phân loại sản phẩm theo mã QR và cân nặng sử dụng ROS2 Communication
- Phân loại được 3 loại sản phẩm
- Phân loại sản phẩm nhanh chóng, chính xác
- Giao diện giám sát tại hiện trường trực quan
- Dễ bảo trì, nâng cấp
- Sơ đồ biểu diễn công nghệ:
- Lựa chọn phần cứng:
Số thứ tự Tên thiết bị 1. DC Motor XGB-385SAP 2. Servo Motor 995 3. Bridge H Circuit L298N 4. Photo Electric Sensor NPN Type E3F-DS10C4 5. Loadcell YZC-133 6. Converter Module HX711 7. Button 8. Raspberry PI 4B 9. Module Camera 10. HMI5001 11. 5V 10A Power Supply 12. 24V 5A Power Supply 13. Aptomat BKN C16
%% Tạo graph với quy mô từ trên xuống dưới
graph TD
Begin((Start)) --> S_Motor[Khởi động động cơ]
S_Motor --> S_Servo[3 Servo về vị trí khởi tạo]
S_Servo --> Cnn_SQL{Kết nối CSDL ?}
%% Quá trình truy xuất ID để lấy chủng loại sản phẩm
Cnn_SQL --T--> Scan_QR[Quét mã QR, lưu ID]
Cnn_SQL --F--> Error_notify[Cảnh báo lỗi]
Scan_QR --> Query_SQL[Query DB Type_Prd via ID]
Query_SQL --> S1_Weigh{CB_Can_1 == 1?}
%% Bắt đầu quá trình cân
S1_Weigh --T--> S2_Weigh{CB_Can_2 == 1?}
S1_Weigh --F--> S1_Weigh
S2_Weigh --T--> S_Servo_1{CB_Servo_1 == 1?}
S2_Weigh --F--> Weigh[Cân]
Weigh --> S2_Weigh
%% Bắt đầu quá trình phân loại
S_Servo_1 --> Checking_PType_TBDT{Type_Prd == 'TBDT'?}
%% Phân loại sản phẩm TBDT
Checking_PType_TBDT --T--> Keep_Pst_Servo_1[Servo_1 giữ nguyên vị trí]
%% Phân loại sản phẩm QA
Checking_PType_TBDT --F--> Rotate_Servo_1[Servo_1 quay 45 độ]
Rotate_Servo_1 --> Tmr_1{T1 == 30s}
Tmr_1 --T--> Rvs_Servo_1[Servo_1 quay -45 độ]
Tmr_1 --F--> Tmr_1
Rvs_Servo_1 --> S_Servo_2{CB_Servo_2 == 1?}
S_Servo_2 --T--> Checking_PType_QA{Type_Prd == 'QA' ?}
S_Servo_2 --F--> S_Servo_2
Checking_PType_QA --T--> Keep_Pst_Servo_2[Servo_2 giữ nguyên vị trí]
%% Phân loại sản phẩm không thuộc CSDL
Checking_PType_QA --F--> Rotate_Servo_2[Servo_2 quay 45 độ]
Rotate_Servo_2 --> Tmr_2{T2 == 1.5s ?}
Tmr_2 --T--> Rvs_Servo_2[Servo_2 quay -45 độ]
Tmr_2 --F--> Tmr_2
Rvs_Servo_2 --> S_Servo_3{CB_Servo_3 == 1?}
S_Servo_3 --T--> Keep_Pst_Servo_3[Servo_3 giữ nguyên vị trí]
S_Servo_3 --F--> S_Servo_3
Keep_Pst_Servo_3 --> End((End))
- Chú thích:
- Servo_n: Servo thứ n
- CB_Can_n: Cảm biến cho vùng cân thứ n
- Type_Prd: Chủng loại sản phẩm sau khi truy xuất ID sản phẩm
- CB_Servo_n: Cảm biến dùng cho việc phân loại kết hợp với servo thứ n
- Tn: Timer thứ n
- Dễ bảo trì, nâng cấp
- Độ trễ thấp
- Sử dụng DDS làm hệ thống middleware -> thuận lợi việc truyền thông giữa các chức năng
flowchart TB
subgraph Module_Scanning_Interface
node_1[node_module_scanning_interface]
end
- Trong đó:
- Module_Scanning_Interface: Nhóm chức năng dùng để quét mã QRCode, thực hiện chức năng truy vấn CSDL và hiển thị giao diện trực quan cho người dùng được đóng gói thành 1 Package
- node_module_scanning_interface: 1 đơn vị chức năng (node) dùng để quét mã QRCode, thực hiện chức năng truy vấn CSDL và hiển thị giao diện trực quan cho người dùng
flowchart TB
subgraph Module_Motor
node_1[node_dc_motor]
node_2[node_dc_servo]
end
- Trong đó:
- Module_Motor: Nhóm chức năng dùng để điều khiển động cơ được đóng gói thành 1 Package
- node_dc_motor: 1 đơn vị chức năng (node) dùng để điều khiển động cơ DC
- node_dc_servo: 1 đơn vị chức năng (node) dùng để điều khiển động cơ servo
flowchart TB
subgraph Module_Input
node_1[node_io_servo]
node_2[node_io_start_stop_pending]
node_3[node_io_weigh]
end
- Trong đó:
- Module_Input: Nhóm chức năng nhận tín hiệu đầu vào từ cảm biến và nút nhấn được đóng gói thành 1 Package
- node_io_servo: 1 đơn vị chức năng (node) dùng để nhận tín hiệu từ cảm biến trong vùng phân loại
- node_io_start_stop_pending: 1 đơn vị chức năng (node) dùng để nhận tín hiệu từ nút nhấn Start (xanh), Stop (đỏ) và Pending (vàng)
- node_io_weigh: 1 đơn vị chức năng (node) dùng để nhận tín hiệu từ cảm biến trong vùng cân
flowchart TB
subgraph Module_Weigh
node_1[node_module_weigh]
end
- Trong đó:
- Module_Weigh: Nhóm chức năng thực hiện nhiệm vụ cân được đóng gói thành 1 Package
- node_module_weigh: 1 đơn vị chức năng (node) thực hiện nhiệm vụ cân
flowchart TB
subgraph Module_Supervisor
node_1[node_module_supervisor]
end
- Trong đó:
- Module_Supervisor: Nhóm chức năng thực hiện nhiệm vụ thực hiện kết nối các Packages, thực thi hủy, khởi tạo hệ thống được đóng gói thành 1 Package
- node_module_supervisor: 1 đơn vị chức năng (node) thực hiện kết nối các Pạckages, thực thi hủy, khởi tạo hệ thống
flowchart TB
subgraph Module_Log_File
node_1[node_module_log_file]
end
- Trong đó:
- Module_Log_File: Nhóm chức năng thực hiện nhiệm vụ tạo file log hệ thống được đóng gói thành 1 Package
- node_module_log_file: 1 đơn vị chức năng (node) thực hiện nhiệm vụ tạo file log hệ thống
flowchart TB
subgraph Module_Send_Email
node_1[node_module_send_email]
end
- Trong đó:
- Module_Send_Email: Nhóm chức năng thực hiện nhiệm vụ gửi mail cho các admin đính kèm file log đã nén được đóng gói thành 1 Package
- node_module_send_email: 1 đơn vị chức năng (node) thực hiện nhiệm vụ gửi mail cho các admin đính kèm file log đã nén
- Các Service này được dùng cho việc thực hiện nhiệm vụ thực hiện kết nối các Packages, thực thi hủy, khởi tạo hệ thống
Service | Client | Thuộc Node |
---|---|---|
node_io_servo | node_module_supervisor | node_io_servo |
node_io_weigh | node_module_supervisor | node_io_weigh |
module_scanning_interface | node_module_supervisor | node_module_scanning_interface |
module_send_email | node_module_supervisor | node_module_send_email |
module_weigh | node_module_supervisor | node_module_weigh |
node_dc_motor | node_module_supervisor | node_dc_motor |
node_dc_servo | node_module_supervisor | node_dc_servo |
- /set_start_stop_pending
- /weigh_io
- /servo_io
- /terminate
- /rotate_servo
- /sendfilename
- /get_weigh
- Hệ thống được chia thành 3 giai đoạn:
graph TD
node_ssp[node_io_start_stop_pending] --Topic:/set_start_stop_pending--> node_sp[node_module_supervisor]
node_sp --srv:node_io_servo--> node_io_servo
node_sp --srv:node_io_weigh--> node_io_weigh
node_sp --srv:node_module_scanning_interface--> node_module_scanning_interface
node_sp --srv:node_module_send_email--> node_module_send_email
node_sp --srv:node_module_weigh--> node_module_weigh
node_sp --srv:node_dc_motor-->node_dc_motor
node_sp --srv:node_dc_servo-->node_dc_servo
- Sau thời điểm nhấn nút nhấn Start, hệ thống được khởi tạo thông qua việc node_io_start_stop_pending publish một message qua Topic node_io_start_stop_pending cho các Subscriber
- Sau khi node_module_supervisor nhận được message qua Topic node_io_start_stop_pending, nó sẽ gửi request qua các service mà nó đã đăng ký cho các server tương ứng để thực hiện chức năng khởi tạo
- Sau khi khởi tạo, node_module_supervisor sẽ luôn kết nối lại sau 2s để nhận biết được node nào đang hoạt động và quyết định xem có hủy hệ thống hay không
- Dữ liệu sản phẩm được lưu trong cấu trúc như sau
['ID_Product','Type_Product','Weigh']
- CTDL trên sẽ được lưu 1 Queue nằm trong 1 Hash Table, với các key tương ứng là vị trí tại các khoang phân loại
{"S1":[[],[],...],"S2":[[],[],...],S3:[[],[],...]}
graph TD
Scan_QR[Quét mã QR để lấy ID sản phẩm] --> Query_DB[Get Type_Product via querying DB]
Query_DB --> Get_Type_Product{Type_Product != None}
Get_Type_Product --T--> Save_If_Exited
Get_Type_Product --F--> Save_If_Not_Existed
- Tại khối Save_If_Existed, thuộc tính thứ 2 nằm trong phần tử đầu tiên trong Queue ứng với key đầu tiên trong Hash Table sẽ là Type_Product truy vấn được
- Tại khối Save_If_Not_Existed, phần tử thứ 2 của cấu trúc sẽ có giá trị là "Khac"
- Để lưu được thông tin, hệ thống sẽ kiểm tra xem những phần tử CTDL nào thuộc key đầu tiên trong Hash Table có 1 thuộc tính
- Tất cả công việc trên được thực hiện trong node_module_scanning_interface
graph TD
node_io_weigh[node_io_weigh] --Topic:/weigh_io--> node_module_weigh[node_module_weigh]
node_module_weigh[node_module_weigh] --Topic:/get_weigh--> node_module_scanning_interface
- Trong giai đoạn này, khi phát hiện được vật đi vào vùng cân, node_io_weigh sẽ publish 1 message với Topic là /weigh_io cho các Subscriber có nội dung là trạng thái của cảm biến trong vùng cân
- node_module_weigh sau khi nhận được message, tiến hành cân vật
- Sau khi kết thúc quá trình cân (vật ra khỏi vùng cân) , node_module_weigh sẽ publish 1 message thông qua Topic:/get_weigh cho các Subscriber có nội dung là giá trị cân nặng của sản phẩm
- node_module_scanning_interface sau khi nhận được message sẽ hiển thị và cập nhật giá trị vào CTDL có key đầu tiên trong Hash Table
graph TD
node_io_servo[node_io_servo] --Topic:/servo_io--> node_module_scanning_interface[node_module_scanning_interface]
node_module_scanning_interface[node_module_scanning_interface] --Topic:/rotate_servo--> node_dc_servo[node_dc_servo]
- Trong giai đoạn này, sau khi kết thúc 2 quá trình là quét QR và cân, sản phẩm sẽ được đưa đến vùng phân loại
- Khi sản phẩm được phát hiện tại cảm biến của từng khoang phân loại, node_io_servo sẽ gửi 1 message có Topic là /servo_io cho tất cả Subscriber có nội dung là trạng thái cảm biến tại vùng phân loại
- node_module_scanning_interface sau khi nhận được message từ Topic /servo_io, tiến hành kiểm tra 'Type_Product' tại CTDL đầu tiên thuộc Queue có key đầu tiên trong Hash Table để quyết định xem nó sẽ vào khoang nào
- Nếu không thuộc kiểu sản phẩm phù hợp ở khoang, CTDL đầu tiên sẽ bị loại bỏ khỏi Queue thuộc key tương ứng và được thêm vào sau cùng CTDL của Queue của key kế cạnh (sản phẩm không thuộc bất kỳ kiểu sản phẩm nào chi cần loại bỏ CTDL ra khỏi Queue) để tiến hành kiểm tra ở khoang tiếp theo qua việc tiếp xúc với cảm biến tại vị trí khoang tương ứngứng
- Sau khi quyểt định được khoang cần phân loại, node_module_scanning_interface sẽ gửi 1 message với Topic là /rotate_servo để chuyển sản phẩm vào khoang tương ứng
- Giai đoạn hủy hệ thống
graph TD
node_ssp[node_io_start_stop_pending] --Topic:/set_start_stop_pending--> node_sp[node_module_supervisor]
node_sp --Topic:/terminate--> node_module_log_file
node_module_log_file --Topic:/sendfilename--> node_module_send_email
node_sp --Topic:/terminate--> node_io_servo
node_sp --Topic:/terminate--> node_io_weigh
node_sp --Topic:/terminate--> node_module_scanning_interface
node_sp --Topic:/terminate--> node_module_weigh
node_sp --Topic:/terminate-->node_dc_motor
node_sp --Topic:/terminate-->node_dc_servo
- Trong giai đoạn này, khi nhấn nút stop, node_io_start_stop_pending sẽ gửi 1 message trong Topic:/set_start_stop_pending cho Subscriber
- node_module_supervisor sau khi nhận được message, tiến hành publish message với Topic:/terminate nhằm dừng hoàn toàn mọi chức năng của hệ thống
- node_module_log_file sau khi nhận được message, tiến hành lấy file log nén lại. Sau khi nén xong gửi 1 message trong Topic:/sendfilename cho Subscriber
- node_module_send_email sau khi nhận được message từ Topic:/sendfilename, tiến hành gửi mail cho admin đính kèm file nén