- Tính mạnh mẽ
Xét về mặt lý thuyết, thuật toán này đã đảm bảo được tính mạnh mẽ. Các robot khi gặp một cell cũ của một đồng nghiệp khác, nó đã tiến hành lưu lại vị trí gặp nhau đó nhằm giúp đỡ trong tình huống robot đồng nghiệp bị chết sau này. Nếu nó gặp được đúng lúc và biết được robot kia chết thì nó sẽ thực hiện công việc của robot kia kịp thời tránh quay lui.
Đoạn sau thuật toán, khi robot đã hoàn thành công việc nhưng chưa hoàn toàn dừng hẳn ngay lập tức, mà vẫn tiếp tục hoạt động cho đến khi tất cả các đồng nghiệp của nó đã hoàn thành công việc. Trong khi các đồng nghiệp chưa hoàn thành, nó định kỳ kiểm tra trạng thái của các robot đồng nghiệp xem có robot nào bị chết hay không.
- Tính bao phủ toàn bộ:
o Trong trường hợp 𝑘 = 1:
Với chỉ một robot, việc xây dựng cây con nó sẽ tìm theo các hướng dựa trên vị trí subcell của robot. Nếu không tìm thấy cell mới nào nó sẽ thực hiện tìm kiếm các subcell còn lại của cell việc tìm kiến kết thúc khi khi tìm thấy hoặc tất cả subcell của cell đã được thăm. Nếu tìm thấy nhiều hơn một ô. Tất cả khoảng cách là bằng nhau nên nó sẽ lấy giá trị đầu tiên nó đã gán trong list_N danh sách. Khi nó không tìm thấy cell mới nào nữa thì nó sẽ quay về cell đi ra của cell đó (ô cha) và thực hiện tìm. Kết thúc quay về cell ban đầu và tìm không tìm thấy cell nào nữa. Mà khu vực làm việc liên tiếp nên nó sẽ không thể bỏ qua cell nào. Vậy sẽ tìm hết được toàn bộ các cell trên khu vực W.
o Trong trường hợp 𝑘 > 1:
Giả sử rằng có 𝑘 − 1 robot có thể hoàn thành một khu vực làm việc. Ta chứng minh rằng 𝑘 robot cũng có thể hoàn thành khu vực W. Không mất tính tổng quát, ta xét một robot 𝑖 đơn lẻ. Với các cell có vật cản như hình 3.5..a và 14.c và các cell như trong thuật toán 6. Khi thực thi thuật toán MSTC-full, nó sinh ra một cây bao trùm cục bộ, với những cell cũ của riêng nó, và tạo ra một đường bao phủ cho một vài cell mà nó đảm nhiệm. Các robot khác sẽ xem như các cell này đã bị chiếm, và coi nó chính xác như việc nó là một cell được lấp đầy bởi một vật cản. Bởi vậy, tất cả những cell khác cũng được chia thành 𝑘 − 1 đường đi và được 𝑘 − 1 robot bao phủ, giống như với giả sử ban đầu được đặt ra. Robot 𝑖 cũng xem tất cả các cell bị chiếm bởi 𝑘 − 1 robot kia như là một vật cản, do đó nhiệm vụ của nó trở thành bao phủ toàn bộ một khu vực làm việc, giống như với trường hợp 𝑘 = 1 ở trên. Trường hợp với như hính 14.c robot sẽ kiểm tra cho phép các subcell của cell mất kết nối đó chỉ được bao phủ bởi duy nhất 1 robot.
- Tính không dư thừa
Nếu tất cả robot đều thực thi theo thuật toán ở trên, và không robot nào bị chết, sẽ không có cell nào bị đi nhiều hơn 1 lần. Điều này có thể chứng minh như
sau:
Nếu không có robot nào bị lỗi, và mỗi robot chỉ đi theo những cell được xây dựng bởi cây bao trùm. Nếu mỗi subcell của cell đó đã được xét thì nó sẽ không thực hiện xét lại nữa. Nếu một cell đã được robot khác đi với các trường hợp cell không giống hình 3.5.c, nó đã được đánh dấu là cell cũ, bởi vậy không có một robot nào khác có thể đi vào cell đó nữa. Nếu cell cũ trường hợp hình 3.5.c thì mỗi vị trí sẽ xem như là 1 cell và nó chỉ đươc xem chỉ thuộc nodes của một robot. Nếu robot không có quay lui, sẽ không có một cell nào bị đi quá nhiều hơn 1 lần.
CHƯƠNG 4. CÀI ĐẶT VÀ THỬ NGHIỆM CÁC THUẬT TOÁN MSTC 4.1. Giới thiệu một số công cụ, phần mềm sử dụng
4.1.1. Giới thiệu về ROS
ROS (Robot Operating System) là tập hợp các framework cung cấp những chức năng tương tự hệ điều hành để phát triển các phần mềm sử dụng cho robot. ROS hỗ trợ đầy đủ mọi dịch vụ tiêu chuẩn như trừu tượng hóa phần cứng, điều khiển thiết bị mức thấp, thư viện, thực hiện truyền thông điệp và quản lý đóng gói. Các tiến trình trong ROS được thử nghiệm theo cấu trúc đồ thị với mỗi tiến trình ứng với từng node có thể nhận, thông báo và kết hợp các cảm biến, bộ điều khiển, định mức hiện trạng, quy hoạch, bộ truyền động cùng nhiều thông điệp khác. Khả năng phản ứng nhanh và độ trễ thấp là những yêu cầu quan trọng với ứng dụng robot nhưng cho dù vẫn có thể tương tác với một số đoạn mã xử lý tức thời, bản thân ROS không phải là hệ điều hành thời gian thực.
Các phần mềm trong ROS được chia làm 3 nhóm:
- Các công cụ độc lập với ngôn ngữ lập trình và nền tảng phần cứng dùng để xây dựng và phân phối những phần mềm cơ bản cho ROS.
- Bộ thư viện áp dụng cho bên client để thử nghiệm.
- Các gói chứa mã hỗ trợ dùng cho một hoặc nhiều thư viện.
Các công cụ và thư viện chính viết bằng C++, Python hoặc LISP, được phát hành theo bản quyền của BSD và đều là mã nguồn mở, miễn phí cho sử dụng trong nghiên cứu hoặc ngay cả với mục đích thương mại. Đa phần những gói công cụ còn lại phát hành dưới nhiều bản quyền mã nguồn mở đa dạng, đóng vai trò thử nghiệm các chức năng và ứng dụng dùng chung như trình điều khiển phần cứng, mô hình hóa robot, phân loại dữ liệu, quy hoạch, nhận thức, lập bản đồ, định vị đồng thời hay mô phỏng cùng nhiều giải thuật khác.
Những thư viện chính của ROS thiết kế hướng tới hệ thống tương tự UNIX, chủ yếu vì phải phụ thuộc nhiều vào lượng lớn những phần mềm mã nguồn mở. Một trong số các hệ điều hành được hỗ trợ có thể kể đến như là Ubuntu Linux, còn
đang thử nghiệm. Trong khi đó thư viện rosjava viết bằng Java không bị giới hạn như vậy nên khiến cho các phần mềm của ROS cài đặt được trên hệ điều hành Android hay kết hợp sử dụng cùng các công cụ MATLAB, vốn có thể chạy trên Linux, Mac OS X và dĩ nhiên cả Microsoft Windows. Còn thư viện roslibjs viết bằng Javascript lại được phát triển để tương tác với hệ thống ROS thông qua bất kỳ trình duyệt web chuẩn nào.
Sử dụng phiên bản ROS Indigo được cài đặt trên Ubuntu 14.04.
4.1.2. Giới thiệu về Gazebo
Gazebo là một chương trình mô phỏng nhóm robot 3 chiều trong nhà và ngoài trời, hỗ trợ vật lý động học và động lực học cùng nhiều phương tiện khác. Các trình cắm Gazebo giúp kết hợp ROS và Gazebo với nhau để hỗ trợ nhiều loại robot và cảm biến. Vì các trình cắm này biểu diễn cùng giao diện thông điệp với hệ thống ROS nên ta có thể viết các node của ROS hoàn toàn tương thích với bộ mô phỏng, dữ liệu ghi nhật ký và phần cứng, cũng như có thể phát triển ứng dụng rồi thử nghiệm cho robot trong môi trường thực tế mà không cần hoặc thay đổi rất ít mã nguồn. Gazebo có thể thực hiện mô phỏng với độ chính xác và hiệu năng cao cho môi trường nhóm robot cả trong nhà và ngoài trời. Gazebo cung cấp khả năng xử lí chân thực cùng bộ các cảm biến hữu dụng và giao diện thân thiện cho người dùng và chương trình. Sử dụng Gazebo phiên bản 2.2.6.
4.1.3. Giới thiệu robot Kobuki
Kobuki, tên gọi đầy đủ iClebo Kobuki là một thiết bị di động giá rẻ, thiết kế cho mục đích giáo dục và nghiên cứu trong lĩnh vực robot. Ngoài khả năng hoạt động liên tục, Kobuki có thể cấp nguồn cho máy tính khác cũng như các bộ phận cảm biến và bộ phận vận động. Kobuki sở hữu dụng cụ đo hành trình được cải thiện bằng con quay hồi chuyển đã hiệu chỉnh, cho phép di chuyển với độ chính xác cao.
Hình 4.1: Robot Kobuki
4.1.4. Giới thiệu Hokuyo
Là cảm biến dạng máy dò tầm quét laser, tối ưu cho công việc nhận dạng môi trường. Hokuyo thích hợp với các robot thông minh thế hệ mới với hệ thống tự động và bảo mật riêng tư.
Tính năng
- Độ chính xác và phân giải cao, góc nhìn rộng cung cấp giải pháp tốt nhất cho robot tự động di chuyển trong môi trường không biết trước
- Kích thước nhỏ gọn tạo nên nhiều không gian thiết kế thoải mái. Nguồn năng lượng tiêu thụ ít, có khả năng hoạt động thời gian dài.
- Không chịu ảnh hưởng bởi độ sáng môi trường, hiệu quả tốt cả trong bóng tối.
- Nhận diện kích thước và vị trí vật thể mà không cần thăm dò quá gần. Ứng dụng
- Hỗ trợ robot tự động nhận biết môi trường xung quanh - Phát hiện kẻ xâm nhập
- Dùng trong cửa tự động, phân tích hành vi đặc thù của con người - Phát hiện vật cản
Hình 4.2: Laze Hokuyo
4.2. Giải quyết bài toán giao tiếp giữa các robot 4.2.1.Vấn đề phát sinh 4.2.1.Vấn đề phát sinh
Trong các thuật toán MSTC ở trên, về lý thuyết thuật toán đã mặc nhiên coi như các robot có thể thoái mái giao tiếp với nhau. Tuy nhiên, khi thử nghiệm thuật toán trong mô phỏng cũng như trong thực tế, vấn đề giao tiếp giữa các robot với nhau cũng là một vấn đề lớn cần quan tâm.
Trong môi trường mô phỏng, nếu chỉ mô phỏng trên một máy, việc giao tiếp này có thể xử lý đơn giản bằng cách lưu thông tin toàn cục vào đâu đó, ví dụ như lưu trong file. Trong quá trình làm luận văn này, cũng đã thử sử dụng ros bag để lưu thông tin về các trạng thái robot, các cell đã đi qua của các robot trong một file bag để các robot mô phỏng có thể truy cập. Việc sử dụng file như vậy có thể giải quyết tạm thời được vấn đề giao tiếp khi mô phỏng trong một máy, tuy nhiên, khi mô phỏng trên 2 hoặc nhiều máy khác nhau (mỗi máy là một robot, cùng chạy chung một bản đồ), hoặc cao hơn, khi chạy trong môi trường thực tế, việc sử dụng file để
4.2.2.Áp dụng lập trình socket với thuật toán MSTC
Sử dụng giao tiếp client-server theo mô hình khách-chủ để giao tiếp giữa các robot.
Hình 4.3: Mô hình client-server sử dụng
Với việc sử dụng một server chung để lưu các thông tin mà các robot cần thông báo cho các đồng nghiệp biết, số lượng kết nối cần thiết sẽ giảm đi so với trường hợp sử dụng mô hình ngang hàng. Khi triển khai trên thực tế, nếu điều kiện không cho phép, hoàn toàn có thể đặt server trên một client, tức là robot được máy tính đó điều khiển vừa chạy server, vừa chạy một thể hiện của client. Có thể hình dung việc này giống như robot đó đóng vai trò là “robot đầu đàn”,
Chức năng của server
Server tiến hành thực hiện các bước cần thiết để khởi tạo server. Sau khi khởi tạo để có thể tiếp nhận kết nối từ phía client thì server khởi tạo sẽ lưu hai biến cần thiết như biến status và old_cells. Biến status trên server lưu trạng thái của tất cả các robot. Nó nhiệm vụ quan trọng như lưu vị trí, trạng thái hay thời gian của từng robot. Biến status là một biến kiểu string, lưu lại trạng thái của toàn bộ robot đang hoạt động để biết robot đang ở đâu và trạng thái như thế nào và thời gian cập nhật. Mỗi trạng thái của từng robot cách nhau bởi dấu “;”, và chúng có dạng: tên robot, hoành độ của cell đang ở, tung độ của cell đang ở, trạng thái, thời gian cập nhật lần cập nhật cuối cùng của từng robot. Server biết các trạng thái của từng robot đó còn sống hay đã chết hay chưa dựa vào các cập nhật của từng robot trên từng thời điềm. Nếu quá 15 giây không có cập nhật của bất kỳ Client nào nó sẽ hiểu là robot đó đã chết và đưa ra trạng thái đó đến mọi robot. Dựa vào biến status để cập
nhật các old_cells. Biến old_cells để lưu các cell của tất cả robots đã đi qua. Nó được thêm vào khi mỗi robot đi vào cell mới. Dựa vào biến old_cells để tránh nhiều robot đi vào cùng một ô. Old_cells sẽ được cập nhật khi có bất kỳ robot nào chết. Server phân biệt các hành động trong tin nhắn từ client nhờ phần mã trong tin nhắn nhận được. Tin nhắn nhận được có dạng: “Mã|Dữ liệu”. Sau khi xử lý xâu, tùy vào đoạn mã nhận được mà server sẽ có hướng xử lý với đoạn dữ liệu phía sau cho thích hợp. Ý nghĩa một số tin nhắn từ client gửi lên server nói chung với mỗi thuật toán:
- [SAVE_STATUS]|Dữ liệu: Client yêu cầu lưu đoạn dữ liệu phía sau vào biến status trên server.
- [SAVE_OLD_CELLS]|Dữ liệu: Client yêu cầu lưu thêm đoạn dữ liệu phía sau vào biến old_cells trên server.
- [GIVE_ME_STATUS]|_: Client yêu cầu server trả về giá trị biến status của server
- [GIVE_ME_OLD_CELLS]|_: Client yêu cầu server trả về giá trị biến old_cells của server.
Hầu như các server trên các thuật toán là giống nhau chỉ khác thêm các công cụ hỗ trợ cho phù hợp với từng thuật toán. Ví dụ như thuật toán MSTC-Ofline thì nó chỉ cần lấy thông tin ban đầu và sau khi thực hiện xong thì nó kiểm tra con robot tiếp theo của nó trạng thái như thế nào.….
Các mã giả phía client trên các thuật toán
Sau khi áp dụng lồng ghép lập trình socket vào, thuật toán ORMSTC chạy trên mỗi robot (mỗi robot đóng vai trò là một client). Mỗi robot cũng giống như thuật toán 4 nó sẽ tạo một thuật toán để tạo các khởi tạo ban đầu. Từ thuật toán 4 có thể viết lại chính xác như sau:
Mã giả thuật toán 11 (pha khởi tạo): Thuật toán 11: Initialization()
1. Chạy hàm socket() 2. Chạy hàm connect()
3. Tính toán chia cell để biết starting_cell dựa trên starting_point
4. Khởi tạo biến status, biến current_cell và old_cells cục bộ trên mỗi robot 5. Gán current_cell = starting_cell
6. Thêm trạng thái của mình vào biến status của gửi lại lên server với yêu cầu lưu trạng thái
7. Thêm starting_cell của mình vào danh sách old_cells, sau đó gửi lên server với yêu cầu lưu old_cells
8. Lấy dữ liệu từ biến status và old_cells của các robot khác trên server xuống để đồng bộ dữ liệu cục bộ.
Giải thích mã giả thuật toán 11
Client tiến hành khởi tạo. Bước 1 và 2 gọi các hàm cần thiết để kết nối tới server. Sau đó tính toán từ vị trí ban đầu để biết cell bắt đầu của nó đang đứng. Thêm trạng thái của nó trên status của robot. Thêm các cell bắt đầu starting_cell thành cell cũ và lưu trên sever. Sau đó tiến hành lấy những giá trị mới nhất trên server về để đồng bộ với dữ liệu cục bộ. Việc trao đổi giữa Server và Client dựa trên các xâu ký tự nên từ đó ta sử dụng các xâu để lưu và xử lý. Ngoài ra, thay vì lưu mảng connection như trong thuật toán bên lý thuyết, ở phần code thử nghiệm, những kết nối này dưới dạng một biến string, đưa những xử lý về cập nhật kết nối về dạng xử lý xâu. Lý do là bởi không thể biết trước một robot có thể gặp bao nhiêu robot đồng nghiệp trong quá trình làm việc, bởi vậy việc khai báo toàn bộ các biến connection như trong lý thuyết là lãng phí và cũng không thể biết trước có bao nhiêu robot sẽ kết nối để khai báo. Bởi vậy, thay vì lưu nhiều giá trị trong mảng, khi thử nghiệm thuật toán, việc lựa chọn việc nối thêm giá trị hoặc thay đổi một phần giá trị vào biến string sau mỗi lần gặp. Như vậy có thể lưu được những kết nối cần thiết chỉ với hai biến.
Các thuật toán ở trên đã nêu trên, để thuật toán đó áp dụng trên thực tế cần áp dụng lập trình socket vào để tiến hành giao tiếp. Ý tưởng chung về lập trình trên