Skip to content

tomccd/Design-Document-For-DATN_ROS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 

Repository files navigation

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

A. Mục tiêu

  • 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

B. Sơ đồ biểu diễn công nghệ và lựa chọn phần cứng

  • Sơ đồ biểu diễn công nghệ: alt text
  • 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

C. Lưu đồ thuật toán tổng quan

%% 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))
Loading
  • 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. Thiết kế chương trình sử dụng ROS2 Framework

I. Lý do lựa chọ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

II. Thiết kế hệ thống

1. Phân bổ bố cục và chức năng của từng Packages

a) Module Scanning Interface
flowchart TB
  subgraph Module_Scanning_Interface
  node_1[node_module_scanning_interface]
  end
Loading
  • 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
b) Module Motor
flowchart TB
  subgraph Module_Motor
  node_1[node_dc_motor]
  node_2[node_dc_servo]
  end
Loading
  • 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
c) Module_Input
flowchart TB
  subgraph Module_Input
  node_1[node_io_servo]
  node_2[node_io_start_stop_pending]
  node_3[node_io_weigh]
  end
Loading
  • 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
d) Module_Weigh
flowchart TB
  subgraph Module_Weigh
  node_1[node_module_weigh]
  end
Loading
  • 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
e) Module_Supervisor
flowchart TB
  subgraph Module_Supervisor
  node_1[node_module_supervisor]
  end
Loading
  • 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
f) Module_Log_File
flowchart TB
  subgraph Module_Log_File
  node_1[node_module_log_file]
  end
Loading
  • 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
g) Module_Send_Email
flowchart TB
  subgraph Module_Send_Email
  node_1[node_module_send_email]
  end
Loading
  • 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

2. Liệt kê các custom services và topic

a) Service
  • 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
b) Topic
  • /set_start_stop_pending
  • /weigh_io
  • /servo_io
  • /terminate
  • /rotate_servo
  • /sendfilename
  • /get_weigh

3. Lưu đồ thuật toán

  • Hệ thống được chia thành 3 giai đoạn:
a) Giai đoạn khởi tạo
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
Loading
  • 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
b) Giai đoạn chạy chức năng hệ thống
i.i) Thực hiện chức năng quét mã QR
  • 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
Loading
  • 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
i.ii) Thực hiện chức năng cân
  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
Loading
  • 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
i.iii) Thực hiện chức năng phân loại
  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] 
Loading
  • 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
c) Giai đoạn dừng, hủy hệ thố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
Loading
  • 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

E. Kết quả

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published