CHƯƠNG I Tổng quan về cuộc thi đấu trường robot 1. Lợi ích của Robot trong lao động sản xuất Hiện nay, việc sử dụng robot trong quy trình sản xuất mang lại nhiều lợi ích đối với các doanh nghiệp. Dưới đây là một số lợi ích quan trọng của việc sử dụng robot trong sản xuất: Tăng cường Năng Suất: Robot có khả năng làm việc liên tục 24/7 quá trình làm việc của robot thường nhanh chóng và chính xác, giảm thời gian sản xuất so với việc thực hiện bằng tay. Chất Lượng Sản Phẩm Tốt Hơn: Robot có khả năng thực hiện các nhiệm vụ một cách chính xác và đồng nhất, giảm nguy cơ lỗi con người.
Kiểm soát chất lượng có thể được tăng cường bằng cách sử dụng robot trong các quy trình kiểm tra và đánh giá chất lượng. An Toàn Lao Động: Việc sử dụng robot giảm đối tượng lao động phải tham gia vào các công việc nguy hiểm và có thể gây nguy cơ cho sức khỏe của họ. Các nhiệm vụ nguy hiểm, nặng nhọc, hoặc lặp lại có thể được chuyển giao cho robot để bảo vệ sức khỏe và an toàn của nhân viên. Giảm Chi Phí Lao Động: Mặc dù chi phí đầu tư ban đầu cho robot có thể cao, nhưng trong thời gian dài, chúng có thể giảm chi phí lao động và tăng tính cạnh tranh của doanh nghiệp.
Tăng Cường Khả Năng Đối Phó với Độ Phức Tạp: Robot có thể xử lý công việc phức tạp, lặp lại, và chi tiết mà con người có thể gặp khó khăn hoặc mệt mỏi khi thực hiện. Để giúp sinh viên dễ dáng tiếp cận hơn trường đã tạo ra CUỘC THI ĐẤU TRƯỜNG ROBOT nhằm tạo sân chơi trí tuệ sáng tạo, là dịp để các bạn trẻ tiếp cận, là nơi giao lưu, học tập, nâng cao kiến thức cũng như phát huy tính sáng tạo trong nghiên cứu, học tập và lao động chuẩn bị hành trang cho cuộc cách mạng công nhiệp lần thứ 4. Giới thiệu về cuộc thi “ Đấu trường Robot ” Tên gọi: Cuộc thi “Đấu trường Robot” năm 2023 Đối tượng tham gia: Là sinh viên đang theo học tại các trường Đại học, Cao đẳng, Học viện trên địa bàn Thành phố Hồ Chí Minh Đơn vị tổ chức: Trường đại học Công Nghiệp thành phố Hồ Chí Minh Tóm tắt thể lệ thi đấu: Các đội tối đa 5 thành viên sẽ thi đấu robot với nhau gồm 2 phần. Phần đầu là thi thoát khỏi mê cung.
Phần 2 là thi đấu Sumo. Một đội chỉ được dùng một Robot ở chế độ tự động cho cả 2 vòng thi.Ở phần thi thoát khỏi mê cung, Robot không thoát khỏi được mê cung sau 2 lần thi sẽ bị loại. Robot thoát được mê cung trong 2 lần thi đấu sẽ được vào vòng 2. Kết quả tốt nhất trong 2 lần sẽ được ghi nhận cho Robot.
Ở phần 2, các Robot thi đấu với nhau dựa trên cuộc thi Sumo của người Nhật. Các Robot không được phép sử dụng vũ khí và không được phép lật đổ lẫn nhau. Nhiệm vụ duy nhất của Robot trong trận đấu là đẩy Robot đội khác ra khỏi vòng tròn của sân thi đấu. Cuộc thi giải mã mê cung Hỉnh ảnh cuộc thi đấu trường sumo CHƯƠNG II Tổng hợp lưu đồ giải thuật và thiết kế thuật toán cho robot giải mê cung và robot sumo 1.
Phương án giải thuật để robot có thể thoát khỏi mê cung 1.1 Giới thiệu thuật toán tím kiếm theo chiều rộng (BFS) 1.1 Giới thiệu Thuật toán tìm kiếm theo chiều rộng (BFS): là một thuật toán tìm kiếm trong đồ thị, được sử dụng để tìm kiếm đường đi từ một đỉnh bắt đầu đến một đỉnh đích trong đồ thị không có trọng số. Cách hoạt động của BFS như sau: (1). Bắt đầu từ đỉnh bắt đầu, đánh dấu đỉnh này là “đã thăm” và thêm nó vào hàng đợi (2). Lặp lại các bước sau đó cho đến khi hàng đợi trống: Lấy một đỉnh từ đầu hàng đợi Kiểm tra xem đỉnh này có phải là đỉnh đích hay không.
Nếu có, thuật toán kết thúc và trả về đường đi từ đỉnh bắt đầu đến đỉnh đích. Nếu không, thêm tất cả các đỉnh kề cận của đỉnh hiện tại mà chưa được thăm vào hàng đợi và đánh dấu chúng là “đã thăm” (3). Nếu thuật toán không tìm thấy đỉnh đích sau khi đã thăm hết tất cả các đỉnh có thể, nghĩa là không có đường đi từ đỉnh bắt đầu đến đỉnh đích. BFS đảm bảo tìm ra đường đi ngắn nhất từ đỉnh bắt đầu đến đỉnh đích trong trường hợp đồ thị không có trọng số.
Nó duyệt qua các đỉnh theo cấp độ, tức là trước tiên duyệt qua các đỉnh cách đỉnh bắt đầu 1 bước, sau đó duyệt qua các đỉnh cách đỉnh bắt đầu 2 bước và tiếp tục cho đến khi tìm thấy đỉnh đích hoặc đã thăm hết tất cả các đỉnh có thể.2 Giới thiệu thuật toán tìm kiếm theo chiều sâu DFS 1.1 Giới thiệu Thuật toán tìm kiếm theo chiều sâu (DFS) là một thuật toán tìm kiếm trong đồ thị, được sử dụng để tìm kiếm đường đi từ một đỉnh bắt đầu đến một đỉnh đích trong một đồ thị không có trọng số. Cách hoạt động của DFS: (1). Bắt đầu từ đỉnh bắt đầu, đánh dấu đỉnh này là “đã thăm” và thực hiện các hành động liên quan đến đỉnh này. Lặp lại các bước sao cho tất cả các đỉnh kề cận của đỉnh kề cận của đỉnh hiện tại mà chưa được thăm: Chọn một đỉnh kề cận chưa được thăm Đánh dấu đỉnh này là “đã thăm” và thực hiện các hành động liên quan đến đỉnh này Tiếp tục thực hiện DFS từ đỉnh này (3).
Nếu không còn đỉnh kề cận nào chưa được thăm, quay lại đỉnh trước đó và tiếp tục lặp lại bước 2 cho các đỉnh kề cận khác chưa được thăm (4). Nếu đã thăm hết tất cả các đỉnh có thể mà không tìm thấy đỉnh đích, thuật toán kết thúc và không có đường đi từ đỉnh bắt đầu đến đỉnh đích DFS thường được thực hiện bằng cách sử dụng đệ quy hoặc stack để lưu trữ các đỉnh cần thăm. Nó khám phá một nhánh của đồ thị càng sâu càng tốt trước khi quay và khám phá các nhánh khác.3 Sử dụng DFS và BFS để giải mê cung 1.2 Xây dựng lưu đồ giải thuật robot giải mê cung 1.1 Khai báo mê cung Khai báo mê cung: a. Walls: Một danh sách bốn phần tử biểu diễn tường xung quanh ô, mỗi phần tử là một giá trị Boolean, nếu True thì có tường và False thì không có tường, thứ tự các phần tử biểu diễn lần lượt là tường phía Bắc, Đông, Nam, Tây của ô.
Position: Một danh sách 2 phần tử biển diễn vị trí của ô trong mê cung, phần tử đầu tiên là tọa độ x (hàng), phần tử thứ hai là tọa độ y (cột). Visited: Một giá trị bool biểu diễn việc ô đó đã được khám phá hay chưa, nếu True thì ô đã được khám phá và ngược lại False thì ô chưa được khám phá b. Phương thức (1). Thiết lập thông tin ô (set_position, set_walls, set_visited) (2).
can_move_to: kiểm tra xem có thể di chuyển tử ô này đến ô khác hay không (hai ô liền kề có liên kề nhau không và không có tường giữa chúng) Khai báo Robot: a. Location: Một đối tượng Location biểu diễn vị trí hiện tại của Robot trong mê cung (2). Parent: Một đối tượng State biểu diễn trạng thái trước đó của RoBot. Điều này giúp ta truy vết ngược lại đường đi từ trạng thái hiện tại đến trạng thái bắt đầu (3).
Action: Một số nguyên biễu diễn hành động mà robot đã thực hiện để di chuyển từ trạng thái parent đến trạng thái hiện tại. Giá trị của Action có thể là 0 (không quay), 1 (quay phải), 2 (quay đầu), 3 (quay trái) hoặc -1 là hành động rỗng. Cur_dir: một số nguyên biểu diễn hướng hiện tại của Robot b. Phương thức (1).
Thiết lập thông tin cho trạng thái (set_loc, set_par, set_act, set_cur_dir) (2). Kiểm tra xem trạng thái hiện tại có phải là trạng thái mục tiêu hay không is goal.2 Lưu đồ khám phá mê cung với thuật toán DFS 1.3 Lưu đồ tìm đường đi ngắn nhất với thuật toán BFS 2. Phương án giải thuật cho đấu trường Sumo 2.1 Lưu đồ giải thuật Robot Sumo 3. Mô phỏng thuật toán 3.1 Phần mềm mô phỏng Giao diện chính phần mềm: 2 3 1 1.
Khu vực quan sát: mô phỏng cách di chuyển của Robot trong mê cung 2. Khu vực điều khiển cơ bản (Controls): - Build: Kiểm tra lỗi của đoạn mã hiện tại được nạp trong phần mềm - Run: chạy mô phỏng - : Thanh điều chỉnh tốc độ của Robot 3. Khu vực nạp chương trình (Config) - Maze: chọn đường dẫn file mô tả mê cung - Mouse: chọn đường dẫn file chứa mã chương trình robot tìm kiếm đường đi trong mê cung 3.2 Mã chương trình Robot tìm đường đi ngắn nhất Lựa chọn ngôn ngữ Python (1). Định nghĩa class Location để lưu trữ thông tin về một ô trong mê cung Mã: class Location: def __init__(self, pos=None): self.visited = False if pos is not None: self.visited = vis def can_move_to(self, loc): return (loc.position[0] and loc.position[1] == +1 and not self.walls[0])\ or (loc.position[1] and loc.position[0] == +1 and not self.walls[1])\ or (loc.position[0] and loc.position[1] == -1 and not self.walls[2])\ or (loc.position[1] and loc.position[0] == -1 and not self.
Đinh nghĩa class State để lưu trữ trạng thái của Robot trong mê cung Mã: import location class State: def __init__(self, loc, parent=None, action=None, cur_dir=None): self.location = loc if parent is None: self.parent = self else: self.parent = parent if action is None: self.action = -1 else: self.action = action if cur_dir is None: self.cur_dir = 0 else: self.cur_dir = cur_dir def set_loc(self, loc): self.location = loc def set_par(self, par): self.parent = par def set_act(self, act): self.action = act def set_cur_dir(self, cur_dir): self.cur_dir = cur_dir def is_goal(self): return self.position == [7, 7] or self.position == [7, 8] \ or self.position == [8, 7] or self. Hàm Main ( hàm chạy chính ) import sys from queue import LifoQueue, Queue import API import location import state MAZE_WIDTH = 16 MAZE_HEIGHT = 16 cur_direction = 0 cur_position = [0, 0] maze = [[location.wallRight() walls[(cur_direction + 2) % 4] = False if cur_position == [0, 0]: walls[2] = True return walls def mark_visited_api(pos=None): if pos is None: pos = cur_position API.setText(pos[0], pos[1], "hit") def mark_solution_api(pos=None): if pos is None: pos = cur_position API.setText(pos[0], pos[1], "Sol") def mark_bfs_api(pos=None): if pos is None: pos = cur_position API.setText(pos[0], pos[1], "dfs") def mark_bktrk_api(pos=None): if pos is None: pos = cur_position API.position[0] == 1: _dir = 3 else: _dir = 1 set_dir(_dir) def dfs_map_maze(): cur_loc = maze[cur_position[0]][cur_position[1]] if not cur_loc.visited: cur_loc.set_visited(True) cur_loc.set_walls(get_walls()) mark_visited_api(cur_position) if not cur_loc.visited: loc_stack.put(maze[cur_position[0]][cur_position[1] + 1]) if not cur_loc.visited: loc_stack.put(maze[cur_position[0] + 1][cur_position[1]]) if not cur_loc.visited: loc_stack.put(maze[cur_position[0]][cur_position[1] - 1]) if not cur_loc.visited: loc_stack.put(maze[cur_position[0] - 1][cur_position[1]]) while True: if loc_stack.empty(): if not cur_position == [0, 0]: set_dir((dir_stack.get() + 2) % 4) move_forward() dfs_map_maze() return next_loc = loc_stack.get() if not next_loc.