1. Trang chủ
  2. » Luận Văn - Báo Cáo

Xây dựng hương trình điều khiển robot hút bụi irobot trên môi trường ros

66 4 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Xây Dựng Chương Trình Điều Khiển Robot Hút Bụi Irobot Trên Môi Trường Ros
Tác giả Trần Minh Hải
Người hướng dẫn TS. Ngô Lam Trung
Trường học Trường Đại Học Bách Khoa Hà Nội
Chuyên ngành Hệ Thống Thông Tin
Thể loại Luận Văn Thạc Sĩ
Năm xuất bản 2020
Thành phố Hà Nội
Định dạng
Số trang 66
Dung lượng 6,6 MB

Cấu trúc

  • CHƯƠNG 1. TỔ NG QUAN (13)
    • 1.1 Đặt vấn đề (13)
      • 1.1.1 Robot dịch vụ là gì? (13)
      • 1.1.2 Các ứng dụng của robot dịch vụ (13)
      • 1.1.3 Một số robot hút bụi thương mại hiện có trên thị trường (14)
    • 1.2 Giới thiệu một số khái niệm (16)
      • 1.2.1 Giới thiệu về ROS (16)
      • 1.2.2 Giới thiệu về kobuki (24)
      • 1.2.3 Giới thiệu về hokuyo (25)
    • 1.3 Nội dung đề tài (27)
    • 1.4 Các kết quả đạt đƣợc (27)
  • CHƯƠNG 2. QUÉT BẢN ĐỒ VÀ XÂY DỰNG BẢN ĐỒ LƯỚI (28)
    • 2.1 Quét bản đồ (28)
      • 2.1.1 Quét bản đồ trên môi trường giả lập (28)
      • 2.1.2 Quét bản đồ trên môi trường thực tế (29)
      • 2.1.3 Tìm hiểu file ảnh .pgm và file .yaml (kết quả của quá trình quét bản đồ) (31)
    • 2.2 Xây dựng bản đồ lưới (33)
      • 2.2.1 Khái niệm về cell trong bản đồ lưới (33)
      • 2.2.2 Chuyển đổi bản đồ quét được sang bản đồ lưới (33)
    • 2.3 Kết luận (34)
  • CHƯƠNG 3. ĐIỀU HƯỚNG VÀ ĐỊNH VỊ ROBOT (35)
    • 3.1 Điều hướng robot (35)
      • 3.1.1 Twist (36)
      • 3.1.2 Odometry (37)
      • 3.1.3 Các hàm di chuyển (38)
    • 3.2 Định vị robot sử dụng AMCL (40)
    • 3.3 Kết luận (43)
  • CHƯƠNG 4. THUẬT TOÁN BAO PHỦ (44)
    • 4.1 Thuật toán D* (44)
    • 4.2 Thuật toán Path Transform (PT) (47)
    • 4.3 Thuật toán CCD* (48)
      • 4.3.1 Lý thuyết về thuật toán CCD* (48)
      • 4.3.2 Phân tích thuật toán CCD* (53)
    • 4.4 Áp dụng thuật toán CCD* vào bài toán iRobot (57)
    • 4.5 Kết luận (57)
  • CHƯƠNG 5. CHƯƠNG TRÌNH ĐIỀU KHIỂN IROBOT (59)
    • 5.1 Chương trình điều khiển robot hút bụi iRobot (59)
      • 5.1.1 Mô hình chung (59)
      • 5.1.2 Hàm xử lý phát hiện vật cản (60)
    • 5.2 Các trường hợp ngoại lệ (62)
      • 5.2.1 Robot di chuyển không chính xác (62)
      • 5.2.2 AMCL trả dữ liệu chậm (63)
      • 5.2.3 Laser có sai số (64)
    • 5.3 Kết luận (64)

Nội dung

Tên đề tài: Xây dựng chƣơng trình điều khiển robot hút bụi iRobot trên môi trƣờng ROS.Giáo viên hƣớng dẫn Trang 7 Lời cảm ơnTrƣớc hết, tác giả xin gửi lời cảm ơn chân thành tới TS Ngô L

TỔ NG QUAN

Đặt vấn đề

Xã hội hiện đại, đời sống con người nâng cao Việc robot tham gia vào đời sống con người không phải điều mới lạ Robot phục vụ con người trong nhiều lĩnh vực từ hỗ trợ con người sản xuất đến các công việc mang tính dịch vụ như bƣng bê trong nhà hàng, đón tiếp khách hàng… Một trong những công việc có tính lặp đi lặp lại hàng ngày chính là việc dọn dẹp nhà cửa, cụ thể là việc hút bụi

Nếu có robot làm giúp công việc này, con người sẽ tiết kiệm được rất nhiều thời gian và công sức Với tính cấp thiết nhƣ vậy, tôi quyết định lựa chọn đề tài “Xây dựng chương trình robot hút bụi iRobot trên môi trường ROS”

1.1.1 Robot dịch vụ là gì?

Robot dịch vụ là loại robot hỗ trợ con người trong các công việc lặp đi lặp lại, trong nhà, hoặc ở những môi trường bẩn và nguy hiểm Những robot này thường được điều khiển tự động thông qua một hệ thống điều khiển tích hợp Thuật ngữ “Robot dịch vụ” chưa có một định nghĩa chính xác, theo Liên đoàn Robot Quốc Tế.

IFR) [2] đã đề xuất một định nghĩa: Một robot dịch vụ là một robot mà hoạt động bán hoặc hoàn toàn tự động để thực hiện các dịch vụ hữu ích cho của con người và thiết bị, không bao gồm các hoạt động sản xuất.

1.1.2 Các ứng dụng của robot dịch vụ Ứng dụng có thể có của robot chủ yếu là để hỗ trợ trong công việc của con người Hiện nay có các ứng dụng trong một số lĩnh vực như sau:

- Ứng dụng trong công nghiệp: Robot dịch vụ công nghiệp có thể đƣợc sử dụng để thực hiện các nhiệm vụ đơn giản, chẳng hạn nhƣ kiểm tra hàn Nó cũng có các nhiệm vụ phức tạp hơn, thực hiện trong các môi trường khắc nghiệt, chẳng hạn nhƣ giúp đỡ trong việc tháo dỡ các nhà máy điện hạt nhân Robot cũng có thể đƣợc dùng để thực hiện những hành động lặp đi lặp lại nhƣ lắp ráp, thực hiện các công việc tự động hóa khác Nhƣng robot đƣợc sử dụng trong công nghiệp đƣợc gọi là "Robot công nghiệp".

- Ứng dụng trong các nhà hàng, quán bar, khách sạn: Hiện nay, nhiều nhà hàng, quán bar, khách sạn đã sử dụng robot dịch vụ Các công việc mà robot có thể thực hiện ví dụ nhƣ dọn dẹp, pha chế các đồ uống phức tạp, hay thậm chí là tiếp đón khách hàng.

- Ứng dụng trong gia đình: Robot trong gia đình thực hiện nhiệm vụ mà con người thường xuyên thực hiện xung quanh nhà như lau chùi sàn nhà, cắt cỏ, dọn dẹp hồ bơi Chúng cũng có thể đóng vai trò của một người quản gia trong gia đình.

- Ứng dụng trong khoa học: Hệ thống robot thực hiện nhiều chức năng nhƣ tiến hành các thao tác lặp đi lặp lại trong nghiên cứu Những robot tự động cũng có thể thực hiện các nhiệm vụ khoa học mà con người khó hoặc không thể thực hiện, ví dụ nhƣ các vùng biển sâu, không gian bên ngoài Trái Đất

Hình 1.1 Một ứng dụng của robot dịch vụ

1.1.3 Một số robot hút bụi thương mại hiện có trên thị trường

Hiện nay trên thị trường cũng có rất nhiều loại robot hút bụi khác nhau về giá cả, mẫu mã, khả năng hút bụi, chức năng, cấu tạo phần cứng… Tuy nhiên ở đây, trong phạm vi nghiên cứu, tôi muốn phân tích sự khác nhau về hướng tiếp cận bài toán bao phủ

Các robot hút bụi trên thị trường hiện nay đều có chung một nhiệm vụ là làm sạch toàn diện các vị trí trong phòng Điển hình là các mẫu robot như iLife V5S Pro và Eufy Robovac, chúng được thiết kế để hút bụi và làm sạch sàn nhà một cách hiệu quả.

11S Ecovacs N79s [3], … dựa vào cảm biến để tránh vật cản, điều khiển robot đi theo hướng khác, đường đi do robot này sinh ra là hoàn toàn ngẫu nhiên, do đó tỉ lệ lặp lại cao, tỉ lệ bỏ sót lớn mẫu như ILIFE X750, X787, V8s [3]… Hướng tiếp cận này cũng là hướng tiếp cận tác giả sử dụng để xây dựng hệ thống iRobot.

Hướng tiếp cận thứ ba là điều hướng với camera trực quan Robot được xây dựng trên hướng tiếp cận này là những robot khá hiện đại với trang bị nhiều cảm biến, sử dụng thuật toán VSLAM (Visual Simultaneous Location And Mapping)

Các robot này không cần quét bản đồ trước, có khả năng tạo bản đồ ngay trong khi dọn dẹp nhờ đó hiệu quả công việc tăng đáng kể Một số mẫu robot thuộc loại này nhƣ Roomba i7, Roomba S9, Roomba 960, 980, X800 [3] …

Giới thiệu một số khái niệm

1.2.1 Giới thiệu về ROS a, Khái lƣợc về ROS

ROS (Robot Operating System) là một tập hợp các framework cung cấp công cụ và thƣ viện giúp các nhà phát triển phần mềm có thể tạo đƣợc ứng dụng robot ROS cung cấp trừu tƣợng hóa phần cứng, các trình điều khiến mức thấp, truyền thông điệp, quản lý các gói… [4]

Các tiến trình trong ROS đƣợc triển khai 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 để triển khai.

- 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ò triển khai 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 giả lập 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 những hệ điều hành được hỗ trợ phổ biến là Ubuntu Linux, bên cạnh đó còn có nhiều hệ điều hành khác như Fedora, Mac OS X và Microsoft.

Windows vẫn đang thử nghiệm Trong khi đó thƣ viện rosjava viết bằng Java có thể cài đặt trên mọi nền tảng. b, Các thành phần kiến trúc trong ROS

Hình 1.2 Các thành phần kiến trúc trong ROS [4]

Kiến trúc chung của ROS đƣợc phân chia thành 3 tầng:

- File System Level: Là tầng tổ chức hệ thống file của ROS nhƣ cấu trúc thƣ mục, các tài nguyên.

- Computation Graph Level: Là nơi xử lý giao tiếp, dữ liệu giữa các tiến trình trong một hệ thống hoặc giữa các hệ thống với nhau.

- Community Level: Là nơi cho phép các thành viên trong cộng đồng sử dụng ROS chia sẻ kinh nghiệm, hiểu biết, thuật toán thông qua các module mã nguồn mở của mình.

Hình 1.3 Cấu trúc tầng FileSystem level [4]

- Gói là đơn vị tổ chức mã phần mềm trong ROS Mỗi gói có thể chứa thƣ viện, tập tin thực thi (executables), tập tip kịch bản (scripts), hoặc những tập tin khác.

- Manifests (package.xml): Manifest là một gói mô tả chứa đựng thông tin

Nó sẽ cung cấp thông tin về sự phụ thuộc giữa các gói và lưu trữ thông tin (meta information) về gói đó nhƣ phiên bản, bảo trì, like version, maintainer, giấy phép,

ROS cung cấp hai công cụ có thể tạo gói tin đó là catkin và rosbuild Cách tạo gói tin có thể xem tại: http://wiki.ros.org/vn/ROS/Tutorials/CreatingPackage

Hình 1.4 Cấu trúc package của ROS sử dụng catkin [4]

Message types Định nghĩa các message, được lưu tại: my_package/msg/my_message.msg Định nghĩa dữ liệu gửi trong ROS, thành phần giao tiếp của ROS.

Mô tả dịch vụ, được lưu tại: my_package/srv/my_service.srv

Khai báo cấu trúc dữ liệu của request và response trong dịch vụ của ROS.

Source code của một package trong ROS được lưu trong thư mục src bên trong thƣ mục chứa package có thể tạo nhiều thƣ mục bên trong thƣ mục src này , để tiện quản lý source code theo mục đích sử dụng Các file script sẽ được lưu riêng trong thƣ mục scripts Ngoài bên trong thƣ mục chứa package còn có thêm thư mục include, bên trong thư mục này là các thư mục tương ứng với các package_name chứa các header của các package mà package đang xây dựng cần dùng đến giống nhƣ khái niệm sử dụng thƣ viện(library) của ngôn ngữ C.

Stack đƣợc sử dụng để đơn giản quá trình chia sẻ code Một stack là một thƣ mục chứa một hoặc nhiều package Bên trong stack cũng chứa một file manifest gọi là stack manifest cung cấp mô tả cơ sở dữ liệu về một stack, bao gồm điều kiện cho phép (license) và thông tin về các stack/package khác mà stack kế thừa.

Hình 1.5 Mối liên hệ giữa Stack và Package [4]

Hình 1.6 Các thành phần trong tầng Computation Graph [4]

Node (nút) là một tập tin thực thi, nó dùng ROS để giao tiếp với các nút khác Có thể nói node là tế bào cấu tạo nên chương trình ROS.

Là một nút, nó có nhiệm vụ giúp các nút có thể tìm thấy nhau Hay nói cách khác, nó quản lý các nút.

Master đóng vai trò quan trọng trong việc cung cấp tên đăng ký và hỗ trợ tra cứu giữa các node khác Nếu thiếu master, các node sẽ không thể kết nối và trao đổi thông tin hoặc gọi dịch vụ một cách hiệu quả.

Hình 1.7 Mô hình quản lý của master với các node [4]

Parameter Server là một phần của Master, cho phép dữ liệu về các node được lưu trữ trong một vị trí trung tâm và cho phép các node truy cập đến để tìm kiếm thông tin.

Là một loại dữ liệu để các nút có thể dùng thông qua ROS để giao tiếp với các nút khác.Trong ROS, tệp tin tin nhắn là các tập tin văn bản đơn giản mô tả các trường của một thông điệp ROS Các kiểu dữ liệu trong tin nhắn là các kiểu dữ liệu nguyên thủy Chúng đƣợc sử dụng để tạo mã nguồn cho các tin nhắn trong các ngôn ngữ khác nhau Qua đó, giữa các nút sẽ giao tiếp đƣợc với nhau mà không bị rào cản về mặt ngôn ngữ lập trình.

Hình 1.8 Các kiểu dữ liệu trong message [4]

Nội dung đề tài

Luận văn này trình bày chi tiết các vấn đề nhƣ sau:

- Tìm hiểu tổng quan về framework ROS, robot Kobuki, laser Hokuyo.

- Tìm hiểu cách sử dụng công cụ hector_slam và gmapping để quét bản đồ.

- Sử dụng công cụ map_server để đọc dữ liệu bản đồ Sau đó, tìm hiểu phương pháp chuyển dữ liệu đọc được sang bản đồ lưới

- Tìm hiểu thuật toán AMCL giúp định vị robot Tìm cách áp dụng thuật toán này vào bài toán iRobot

- Xây dựng các hàm điều khiển robot, tìm cách xử lý các ngoại lệ phát sinh khi robot chạy trong môi trường thực tế

- Tìm hiểu và triển khai thuật toán CCD* trong việc bao phủ bản đồ.

Các kết quả đạt đƣợc

- Cài đặt thành công ROS phiên bản indigo và môi trường giả lập Gazebo trên hệ điều hành Ubuntu 14.04 Cấu hình thành công trên các thiết bị thật Tìm hiểu đƣợc các công cụ cơ bản của ROS.

- Tìm hiểu và sử dụng thành công công cụ quét bản đồ hector_slam và gmapping Quét bản đồ được cả trên môi trường giả lập lẫn thực tế.

- Tìm hiểu về thuật toán định vị AMCL, định vị thành công robot trên bản đồ lưới, áp dụng vào bài toán iRobot.

- Xây dựng đƣợc các hàm điều khiển robot, khắc phục đƣợc sai số trong mỗi lần robot di chuyển.

- Triển khai thành công thuật toán CCD*

- Xây dựng thành công 1 hệ thống duy nhất trong đó các thành phần hỗ trợ nhau làm việc

QUÉT BẢN ĐỒ VÀ XÂY DỰNG BẢN ĐỒ LƯỚI

Quét bản đồ

Việc quét bản đồ có thể thực hiện thông qua 2 công cụ ROS cung cấp sẵn là hector_slam và gmapping [7] Tôi sẽ thực hiện quét bản đồ trên môi trường giả lập và thực tế Việc quét bản đồ đƣợc thực hiện bằng laser Hokuyo UTM-30LX

Trên thị trường đa phần các robot cũng đều sử dụng laser để quét bản đồ, một số mẫu robot tiên tiến hơn sử dụng cả Omnivision HD camera (ILIFE X661) hoặc

2.1.1 Quét bản đồ trên môi trường giả lập

Sử dụng công cụ Gazebo để mô phỏng môi trường, phần mềm này được khởi động thông qua gói turtlebot_gazebo Gazebo cho phép xây dựng các mô hình giống như ngoài thực tế, trong đó tác giả đã tạo ra một mặt bằng ngôi nhà với các tường ngăn chia phòng Tất cả các cấu hình của mô hình sẽ được lưu trữ trong file turtlebot_world.launch.

$ roslaunch turtlebot_gazebo turtlebot_world.launch

- Chạy công cụ gmapping có thể thiết lập độ phân giản, kích thước dài rộng , của bản đồ thông qua các tham số delta, xmax, xmin, ymax, ymin

$ rosparam set /slam_gmapping/delta 0.1

- Điều khiển robot di chuyển quanh môi trường để quét – module điều khiển sẽ đƣợc trình bày ở mục 2.1.2

- Sử dụng công cụ rviz để quan sát, kiểm soát quá trình quét bản đồ.

$ roslaunch turtlebot_rviz_launchers view_navigation.launch

Sau khi hoàn tất việc quét bản đồ, bạn cần sử dụng công cụ map_saver trong gói map_server để lưu lại bản đồ Quá trình này sẽ tạo ra một file ảnh định dạng pgm cùng với một file cấu hình yaml.

$ rosrun map_server map_saver -f map_name

Hình 2.2 Kết quả quét bản đồ căn hộ

2.1.2 Quét bản đồ trên môi trường thực tế

- Để quét bản đồ trên môi trường thực tế ROS cung cấp ba gói:, hector_mapping [9]: cung cấp node hector_mapping để quét bản đồ môi trường, dựa vào dữ liệu từ laser trả về đồng thời tính toán vị trí 2D của robot hiển thị lên rviz. hector_geotiff [10]: Cung cấp hector_geotiff_node có chức năng lưu bản đồ dưới dạng ô lưới và quỹ đạo robot hector_trajectory_server [11]: lưu trữ dữ liệu tf.

Để xây dựng bản đồ, cần gắn laser Hokuyo lên robot Kobuki và điều khiển robot di chuyển trong môi trường Chạy lệnh sau để laptop kết nối với Kobuki và Hokuyo.

$ sudo chmod a+rw /dev/ttyACM0

- Thực tế, hokuyo có thể quét bản đồ mà không cần đến robot, robot ở đây chỉ phục vụ cho việc hỗ trợ hokuyo di chuyển quanh môi trường Tuy nhiên, để đảm bảo yêu cầu bài toán quét bản đồ một cách tự động, cần có các thuật toán để di chuyển robot quanh môi trường Để di chuyển robot, ó c ba cách: di chuyển bằng bàn phím robot di chuyển ngẫu nhiên và sử dụng thuật toán CCD* ,

+ Trong cách di chuyển điều khiển bằng bàn phím ắt sự kiện khi kích B phím nào, điều khiển robot di chuyển tương ứng (tiến, lùi, quay trái quay phải) Để di chuyển robot cần tạo một thông điệp geometry_msgs::TwistPtr và gửi thông điệp đó đến chủ đề velocity

+ Trong cách di chuyển ngẫu nhiên, robot sẽ có các cảm biến va chạm, cảm biến độ cao Các cảm biến này sẽ trả dữ liệu về các chủ đề tương ứng, ở đây là bumper và cliff chỉ cần đăng ký các chủ đề này, dựa vào dữ liệu lấy đƣợc để , điều khiển robot di chuyển phù hợp Ngoài ra có thể dùng chính dữ liệu từ laser để phát hiện vật cản Việc điều hướng robot khi có va chạm hoặc cảm biến ra mép ải xử lý trong các hàm callback.ph

+ Mục đích à làm sao robot đi đƣợc hết mọi chỗ trong bản đồ Trong luận l văn này tác giả triển khai thuật toán CCD* để demo Ƣu điểm của thuật toán này là tự phát hiện được vật cản và lập lại đường đi, nên có thể sử dụng chính ưu điểm này để điều khiển robot đi hết bản đồ Bắt đầu bằng việc cài đặt cho robot 1 bản đồ rỗng (không có tường, đồ đạc gì trong phòng) Robot sẽ sinh đường và di chuyển, trong quá trình di chuyển, robot sẽ gặp tường, đồ vật thì nhờ CCD*, nó sẽ tự phát hiện được và sinh đường khác, đi theo đường mới Cứ như vậy, robot có thể đi hết đƣợc bản đồ

- Sử dụng gói hokuyo_node để lấy dữ liệu từ laser hokuyo

$ rosrun hokuyo_node hokuyo_node

- Sau khi có dữ liệu từ laser, việc xây dựng bản đồ đƣợc tiến hành bởi công cụ hector_mapping

$ rosrun hector_mapping hector_mapping screen

$ rosrun hector_geotiff hector_geotiff_node screen

$ rosrun hector_trajectory_server hector_trajectory_server screen

- Chạy rviz để xem quá trình quét bản đồ

$ rosrun rviz rviz -d $(find hector_slam_launch) /rviz_cfg

- Thực hiện điều khiển robot quanh môi trường để hokuyo thu thập dữ liệu

$ rosrun map_server map_saver -f map_name

- Kết quả quét bản đồ tòa nhà B1

Hình 2.3 Bản đồ tòa nhà B1

2.1.3 Tìm hiểu file ảnh pgm và file yaml (kết quả của quá trình quét bản đồ)

- Sau khi quét bản đồ, sử dụng công cụ map_server để lưu Một file yaml và một file ảnh pgm sẽ đƣợc tạo ra

- File ảnh pgm là một file nhị phân thể hiện hình ảnh bản đồ Mỗi byte trong file này thể hiện một điểm trên bản đồ Giá trị của 1 byte có thể từ 1 đến -

100 thể hiện ý nghĩa của điểm ảnh:

- X = -1: Vùng robot không quét đến đƣợc, có thể là ngoài phạm vi tầm quét của laser hoặc không gian kín laser không thể quét.

- 0 Quaternion chứa thông tin về góc của robot x, y, z, w Mặc định ban đầu khi khởi tạo node kobuki, giá trị x, y, z bằng 0, còn giá trị w bằng 1

Khi robot di chuyển, dựatheo việc quay của bánh xe, các giá trị này sẽ đƣợc thay đổi và publish ra kênh /odom.

Dựa vào đó, ó thể tính toán đƣợc việc robot đã di chuyển đƣợc quãng c đường bao nhiêu, quay được góc bao nhiêu độ. Để thuận tiện cho việc quay robot, ROS cung cấp thƣ viện tf::Quaternion chuyển đổi giá trị số sang dạng góc. tf::Quaternion q( odometry->pose.pose.orientation.x, odometry->pose.pose.orientation.y, odometry->pose.pose.orientation.z, odometry->pose.pose.orientation.w); tf::Matrix3x3 m(q); double roll, pitch, yaw; m.getRPY(roll, pitch, yaw);

Trong đó odometry là tin nhắn trả về từ việc subcribe topic /odom Lúc này yaw sẽ nhận giá trị từ 3.14 tới 3.14, giúp việc tính toán quay góc dễ dàng hơn.-

3.1.3 Các hàm di chuyển a, Hàm go

Hàm này điều khiển robot tiến lùi Tham số truyền vào là quãng đường muốn đi Hàm này sẽ tạo message Twist chứa tốc độ di chuyển của robot geometry_msgs::Twist move; move.angular.z = 0; move.linear.x = linearSpeed;

Tiếp theo sử dụng publisher đã đăng ký trước đó liên tục publish message move này đến topic /velocity Robot sẽ đi thẳng với tốc độ linearSpeed Trong khi robot di chuyển, liên tục lấy tọa độ robot nhờ subcribe topic /odom Tính hiệu tọa độ trước sau, dừng lại nếu hiệu này lớn hơn tham số quãng đường. int x = current_pose.x; int y = current_pose.y; while (ros::ok() && computeHypotenuse(current_pose.x - x, current_pose.y - y) < distance) { cmd_vel_pub.publish(move); ros::spinOnce(); rate.sleep();

} move.linear.x = 0; cmd_vel_pub.publish(move); b, Hàm turn và hàm turnToCell

Vì để thuận tiện trong xây dựng bài toán irobot, tác giả có xây dựng hai hàm turn Hai hàm này đều điều khiển robot quay trái phải, tuy nhiên tham số truyền vào hàm turn là góc muốn quay, trong khi tham số hàm turnToCell là tọa độ cell muốn quay đến Nguyên tắc của hai hàm đều là tạo một message Twist, gán tốc độ quay cho message Publish message đến topic /velocity và liên tục lấy góc quay của robot từ topic /odom để kiểm tra điều kiện dừng geometry_msgs::Twist move; move.linear.x = 0; move.angular.z = angularSpeed; while (ros::ok() && (current_pose.theta < std::abs(degree))) { cmd_vel_pub.publish(move); ros::spinOnce(); rate.sleep();

} move.angular.z = 0; cmd_vel_pub.publish(move);

Hàm turn thường được sử dụng trên môi trường giả lập Trong khi hàm turnToCell lại dùng trong môi trường thực tế có nhiều yếu tố tác động khiến việc quay có sai số Nguyên tắc hoạt động vẫn giống nhƣ hàm turn, khác ở chỗ nó sẽ có thêm các biến, case để xử lý các trường hợp ngoại lệ Trong hàm turnToCell, robot sẽ sử dụng AMCL để lấy tọa độ hiện tại cùng với tham số truyền vào để tính toán ra góc quay Nếu có sai số xảy ra, AMCL sẽ lại đƣợc gọi, khi đó góc quay sẽ đƣợc tính toán lại Ngoài ra, còn phải điều chỉnh tốc độ quay để sai số nhỏ nhất Chi tiết sẽ trình bày trong phần các trường hợp ngoại lệ.

Định vị robot sử dụng AMCL

Để robot có thể sửa chữa sai số sau mỗi lần di chuyển, cần phải định vị được robot trên bản đồ lưới Cụ thể hơn là từ dữ liệu laser và môi trường đã biết trước (map.pgm và map.yaml), cần tính toán được robot đang nằm ở cell nào trên bản đồ lưới Việc định vị robot có ý nghĩa quan trọng không chỉ giới hạn trong bài toán iRobot, mà có thể đáp ứng đƣợc nhu cầu khác nhau của các hệ thống robot trong thực tế

ROS cung cấp một công cụ là AMCL (Adaptive Monte Carlo localization, còn gọi là thuật toán định vị robot theo phương pháp Monte Carlo) [12] là công cụ dựa trên dữ liệu quét laser của robot và thông tin về bản đồ đƣợc xây dựng bởi gmapping để xác định tọa độ của robot Công cụ này dựa trên kết quả nghiên cứu của Dieter Fox, Wolfram Burgard, Frank Dellaert, Sebastian Thrun

Nguyên tắc hoạt động của công cụ này là từ một vị trí đầu vào trên bản đồ

(vị trí này đƣợc thể hiện bằng một tham số trong câu lệnh chạy AMCL), nó sẽ sinh ra một tập các hạt xung quanh vị trí đó, mỗi hạt đại diện cho một trạng thái có thể, tức là một giả thuyết về vị trí của robot Sau đó bất cứ khi nào robot di chuyển, nó sẽ dịch chuyển các hạt để dự đoán trạng thái mới sau chuyển động

Khi sensor trả dữ liệu, các hạt cũng đƣợc lấy mẫu lại Quá trình cứ nhƣ vậy lặp lại, dần dần các hạt sẽ hội tụ đƣợc về vị trí thực của robot

Tuy nhiên, kết quả định vị robot của AMCL là lại tọa độ thực trên bản đồ quét được ở chương 2 cần phải tính toán để ra được robot đ ng ở pixel nào T, a ừ pixel, lại có thể tính tiếp ra đƣợc robot đang ở ô cell nào, đây là cái mà tác giả mong muốn.

Hình 3.5 Định vị robot trên bản đồ lưới Khi đó công thức chuyển đổi từ tọa độ bản đồ (x1, y1) sang tọa độ pixel

(pixel_x, pixel_y) sẽ là: pixel_x = (x1 - x) / resolution; pixel_y = (y1 - y) / resolution;

Từ pixel_x, pixel_y và thông tin 1 cell chứa bao nhiêu pixel, có thể dễ dàng tìm ra đƣợc robot đang ở cell nào. Đầu tiên, subcribe topic /scan amcl_sub = nh.subscribe(initTopic("/amcl_pose"), 1,

Sau đó sẽ tính toán dữ liệu đƣợc trả ra từ topic amcl_pose (chính là giá trị x1, y1) Sử dụng cô g thức tính toán phía trên, thu đƣợc vị trí robot theo tọa độ n lưới. void KobukiController::amclHandle(const geometry_msgs::PoseWithCovarianceStampedConstPtr amclpose) { currentCellX = (amclpose->pose.pose.position.x - map.getOriginX()) / map.getResolution(); currentCellY = (amclpose->pose.pose.position.y - map.getOriginY()) / map.getResolution();

- map.getOriginX() và map.getOriginY() là tọa độ góc trái của bản đồ,.

- map.getResolution(): Độ phân giải của bản đồ. Để chạy AMCL, cần đảm bảo laser đã đƣợc kết nối với robot và cổng ttyACM0 đã đƣợc mở, dữ liệu laser thu đƣợc là đầu vào thứ nhất cho AMCL

Chạy map_server để mở bản đồ muốn định vị, đây là đầu vào thứ 2 của

$ rosrun map_server map_server map.yaml

Cuối cùng, chạy câu lệnh AMCL

$ roslaunch turtlebot_navigation amcl.launch

Kết quả thực hiện định vị robot trong môi trường thật

Hình 3.6 Hình ảnh trước khi hội tụ, hình ảnh thể hiện bản đồ lưới và trên phần mềm RVIZ

Hình 3.7 Hình ảnh AMCL xác định được tọa độ robot trên bản đồ lưới

Kết luận

- Các hàm điều hướng robot (turn, go) hoạt động khá chính xác, có sai số tuy nhiên vẫn chấp nhận đƣợc Sai số này sẽ đƣợc cải thiện trình bày trong chương 5 mục 5.2.

- Thuật toán định vị AMCL hoạt động khá chính xác, tuy nhiên kết quả trả về khá chậm và không liền mạch nên chỉ có thể lấy đƣợc tọa độ robot từ AMCL (dữ liệu về hướng phải subscribe topic /odom của node kobuki)

THUẬT TOÁN BAO PHỦ

Thuật toán D*

Thuật toán D* đƣợc trình bày bởi Stentz (1994) [16] Đây là thuật toán sinh đường đi ngắn nhất từ mọi điểm đến điểm đầu vào G trên bản đồ lưới Tại mỗi cell nó duyệt qua, nó sẽ gán cho cell giá trị h chính là độ dài quãng đường ngắn nhất đến G và b (backpoint) lưu cell cha ó thể trích xuất đường dẫn qua , c giá trị backpoint này.

Thuật toán CCD* không dùng toàn bộ lý thuyết của D* mà chỉ áp dụng phần tính toán của D* mà thôi, mục đích chỉ là tìm một đường đi khác khi gặp vật cản, nên trong phần này, tôi sẽ không giới thiệu lại toàn bộ thuật toán D* mà chỉ giải thích cách tính toán của nó mà thôi

Các bước của thuật toán này như sau

1 Gán h(G)=0, b(G)=G Đƣa G vào hàng đợi Q.

2 Nếu Q rỗng, đi đến 5 Nếu không, lấy ra 1 cell từ Q (gọi là cell A)

3 Lấy tất cả hàng xóm của A thỏa mãn không phải vật cản, chƣa đƣợc thăm Nếu không có hàng xóm thỏa mãn điều kiện, đi đến 2 a Nếu cell hàng xóm nằm cùng hàng hoặc cùng cột với A thì gán h(cell hàng xóm) = h(A) + 1 Nếu không thì Gán h(cell hàng xóm) = h(A) + 1.4 (cell hàng xóm nằm chéo, áp dụng định lý pytago để tính ra 1.4) b Gán b(cell hàng xóm) = A c Đƣa cell hàng xóm vào Q sắp xếp theo thứ tự h tăng dần d Đánh dấu cell A đã thăm

Ví dụ về thuật toán D* Cho một bản đồ lưới với cell đầu vào G là cell A4

Các cell có vật cản là cell B3, B4, B5, D3, E2, E3 Nhiệm vụ sinh đường ngắn nhất từ tất cả các cell khác về cell G Cụ thể các bước như sau

- Xét hàng xóm của A4 thỏa mãn không phải vật cản và chƣa thăm là A3,

A5 Gán h(A3) = h(A5) = h(A4) + 1 = 1 vì A3, A5 cùng hàng A4 Gán b của A3,

A5 là A4 Đƣa A3, A5 vào hàng đợi theo thứ tự h tăng dần Đánh dấu A4 đã thăm.

Hình 4.2 Các cell đƣợc gán giá trị

- Lấy A3 từ hàng đợi, xét hàng xóm của A3 thỏa mãn điều kiện là A2, B2

Gán h(A2) = h(A3)+1 = 2 do A2, A3 cùng hàng h(B2) = h(A3)+1.4 = 2.4 do B2,

A3 nằm chéo nhau Gán b(A2)=b(B2) Sau đó đƣa A2, B2 vào hàng đợi Đánh dấu A3 đã thăm.

Hình 4.3 Lấy ra cell từ hàng đợi và gán giá trị cho cell hàng xóm

- Làm tưng tự các bước trên, lấy cell từ hàng đợi Xét với mỗi hàng xóm, gán h và b, đƣa hàng xóm vào hàng đợi Làm nhƣ vậy đến khi hết bản đồ, thu đƣợc kết quả nhƣ sau

Hình 4.4 Kết quả thuật toán D*

Có thể thấy, từ mọi cell, đều có thể tìm được đường ngắn nhất về cell A4 và độ dài quãng đường chính là giá trị h của cell đó Ở đây có lưu ý như sau: đưa các cell vào hàng đợi theo thứ tự h tăng dần nhưng nếu các cell hàng xóm có h bằng nhau thì phải đưa cell nào vào trước

Việc này phụ thuộc vào người xây dựng thuật toán ưu tiên theo thứ tự nào thôi, điều này ảnh hưởng đến kết quả cuối cùng của thuật toán Ví dụ như cell D4, hoàn toàn cell D4 có thể đi sang bên phải để về cell G vẫn đảm bảo quãng đường ngắn nhất, nhƣng nó chọn đi sang trái là bởi vì khi xét cell A3 A5, thì đƣa A3 vào hàng đợi trước.

Thuật toán Path Transform (PT)

Thuật toán CCD* là sự kết hợp của thuật toán D* và thuật toán Path

Transform (PT) [15] CCD* sử dụng phần tính toán của D* để tìm cell mới khi gặp vật cản không xác định còn với thuật toán PT, CCD* lấy ý tưởng từ việc xây dựng đường đi dựa vào trọng số của cell.

Thuật toán PT dựa trên thuật toán lan truyền song wavefront Nó sẽ cung cấp value từ một nút đến nút mục tiêu G Ví dụ, song đƣợc truyền từ G mang giá trị 1 thì nút hàng xóm của G (tính cả các nút chéo) sẽ mang giá trị 2, hàng xóm của hàng xóm G sẽ mang giá trị 3, cứ nhƣ thế…

Hình 4.5 Thuật toán PT[12] Đường đi được xác định bằng cách đi theo nút có giá trị lớn nhất bắt đầu từ nút chỉ định (ví dụ nút S) Điểm cuối cùng của đường hoàn chỉnh sẽ là nút mục tiêu G Sóng lan truyền là tổng các trọng số và sự đo lƣợng khoảng cách với các vật cản Điều này tương tự với việc tìm đường đi trên đồ thị có trọng số đi kèm với mặt nạ chi phí an toàn.

Thuật toán CCD*

4.3.1 Lý thuyết về thuật toán CCD*

Thuật toán CCD* làm việc trên bản đồ lưới với robot được bao phủ bởi một hình vuông 2R+1 cell (R là số nguyên, là bán kính robot) Ô vuông này phải lớn hơn, bao phủ lấy robot và dụng cụ quét ọi ô vuông 2R+1 cell này là mặt nạ , g robot Có thể nhận thấy thuật toán sẽ coi robot là một ô vuông nxn cell, với n là số lẻ Nhƣ vậy sẽ có 1 cell trung tâm robot và bán kính robot sẽ tính bằng (n-1) /

Hình 4.6 Mặt nạ robot với 1 cell trung tâm và bán kính robot bằng 2 cell

Thuật toán bao gồm 2 pha là initial complete và replanning Initial complete là pha khi robot bắt đầu chạy thuật toán, nó sẽ sinh đường bao phủ đầu tiên, replanning là pha khi robot phát hiện vật cản không xác định, nó sẽ tiến hành lập lại đường đi

Nguyên tắc của pha initial complete là duyệt tất cả các cell thỏa mãn điều kiện, nối đường từ cell hiện tại đến cell thỏa mãn điều kiện mà gần cell hiện tại nhất Nếu không tìm thấy cell nào thỏa mãn điều kiện, sử dụng giải thuật D* để tìm cell tiếp theo Trong pha replanning, khi gặp vật cản, bản đồ đƣợc cập nhật, pha initial complete được gọi lại Đường mới và đường cũ sẽ khác nhau tại vị trí vật cản không xác định Robot đi theo đường mới bắt đầu từ vị trí khác nhau này a, Pha initial complete

Các bước trong pha initial được mô tả như sau (nút bắt đầu S)

1 Sét tất cả các cell nằm cách cell S phạm vi nhỏ hơn hoặc bằng bán kính là visited Tất cả các cell nằm cách cell S phạm vi nhỏ hơn hoặc bằng 2 lần bán kính là overlapped.

2 Chọn tất cả các cell thỏa mãn: cùng hàng hoặc cùng cột với S, non- visited và non-overlapped

3 Trong các cell thỏa mãn điều kiện, chọn cell có g nhỏ nhất gọi là M

Nếu không có cell nào thỏa mãn điều kiện, đi đến 5

5 Thực hiện D*(S) và dừng lại tại cell M có 1 trong các điều kiện: non- visited hoặc tồn tại 1 cell non visited nằm cách M một khoảng nhỏ hơn hoặc - bằng bán kính

- Nếu có tồn tại M, sinh đường dựa trên backpoint, gán S = M, quay lại 1

- Nếu không tồn tại M, đi đến 6

Giải thuật pha initial complete

Hình 4.7 Giải thuật pha initial complete[ ]15

Hình 4.8 Quá trình tìm cell hàng xóm thỏa mãn điều kiện cùng hàng hoặc cùng cột, non-visited và non overlapped (mã giả 1- -4) Màu đỏ thể hiện visited, màu vàng thể hiện overlapped[15]

Hình 4.9 Sử dụng D* để tìm cell mới non visited (mã giả 5)- [15]

Kết quả sinh đường pha initial complete trong môi trường giả lập

Hình 4.10 Đường đi sinh ra bởi pha initial complete b, Pha replanning

Trong pha này sẽ có xuất hiện 2 giá trị thể hiện trạng thái là visitedR và overlappedR Hai giá trị này sẽ đƣợc set khi robot thực sự đi qua cell đó, khác với visited và overlapped là 2 trạng thái biểu thị thuật toán đã duyệt qua nó chƣa

Các bước trong pha này như sau:

1 Tính toán D*(S) (mục đích là tính ra h của các cell từ đó chọn đƣợc cell gần nhất)

2 Thực hiện pha initial complete sinh đường P

3 Điều khiển robot đi theo P Đi đến cell nào, sét cell đó visitedR và overlappedR Nếu phát hiện vật cản, cập nhật bản đồ và quay lại 1

4 Nếu đã đi hết P thì kết thúc Nếu chƣa đi hết, lặp lại 3

Hình 4.11 Giải thuật pha replanning[15]

Kết quả đường đi mới được sinh lại khi gặp vật cản

Hình 4.12 Kết quả sinh lại đường đi pha replanning khi gặp vật cản[15]

4.3.2 Phân tích thuật toán CCD* Để tìm kiếm một giải thuật sinh đường cho bài toán robot hút bụi thì có rất nhiều Tuy nhiên, với robot hút bụi, yêu cầu phải quét hết vị trí (bao phủ bản đồ) và tránh lặp lại những vị trí đã quét Mỗi thuật toán có 1 ƣu điểm, nhƣợc điểm khác nhau, nhƣng để tìm ra một thuật toán đáp ứng đƣợc cả hai yêu cầu trên là rất khó Căn cứ mức độ quan trọng của các yêu cầu, CCD* đƣợc lựa chọn vì nó là giải thuật bao phủ được toàn bộ bản đồ và có lặp lại đường đi a, Thuật toán CCD* bao phủ toàn bộ bản đồ

Với thuật toán CCD*, mỗi cell đi qua sẽ set trạng thái là visited Giả sử,

CCD* không quét đƣợc toàn bộ bản đồ, vậy sẽ tồn tại cell là non visited Nếu có - cell là non-visited thì D* khi duyệt sẽ phát hiện ra (dòng 11 pha initial complete) và sinh đường tới đó, nghĩalà cell đó trước sau cũng sẽ được robot duyệt qua và khi duyệt qua nó sẽ là visited Vậy, khi thuật toán CCD* kết thúc, tất cả các cell sẽ là visited, cũng có nghĩa thuật toán CCD* có thể quét toàn bộ bản đồ b, Thuật toán CCD* lặp lại đường đi

Thuật toánCCD* có lặp lại đường đi Đây là một nhược điểm của thuật toán tuy nhiên nếu so sánh với thực tế thì điều này không thể tránh khỏi (đi vào ngõ cụt) và không quá quan trọng Các robot hút bụi trong thực tế cũng có lặp lại vị trí đã quét miễn là quét đƣợc toàn bộ bản đồ.

Mức độ lặp lại đường đi của thuật toán phụ thuộc vào các yếu tố sau:

- Hướng ưu tiên: khi robot tìm được các vị trí thỏa mãn điều kiện (cùng non-visited và g bằng nhau) thì phải ưu tiên chọn ra một vị trí để sinh đường Ưu tiên theo các hướng khác nhau thì cũng sinh ra đường khác nhau Đường khác nhau thì sẽ ảnh hưởng đến mức độ lặp lại Ngoài ra bản thân thuật toán D* khi phải đƣa các cell vào hàng đợi cũng phải ƣu tiên theo một quy tắc nào đó (nhƣ trình bày trong chương 4.1), điều này cũng gây ảnh hưởng đến mức độ lặp lại của

CCD* Tuy nhiên, yếu tố này là hoàn toàn ngẫu nhiên, không thể nói rằng nếu đi theo hướng này thì sẽ tốt hơn đi theo hướng kia

- Có gặp vật cản động hay không: Nếu đang đi mà gặp vật cản, robot phải sinh lại đường Thêm vật cản, đường đi phải phức tạp hơn từ đó cũng gây mức độ lặp lại cao hơn

- Bản đồ: bản đồ càng đơn giản (căn phòng ít đồ đạc) thì đường sinh ra càng đơn giản, mức độ lặp lại ít Ngươc lại bản đồ phức tạp thì đường đi cũng phức tạp gây ra mức độ lặp lại cao.

- Vị trí xuất phát: yếu tố này có ảnh hưởng nhưng ảnh hưởng rất nhỏ Khi robot xuất phát ở sát tường hay góc phòng bao giờ đường đi cũng ít lặp lại hơn so với robot xuất phát ở giữa nhà, bởi vì khi xuất phát giữa nhà, nhiều khả năng các phải nhờ tới tìm kiếm D* mà khi dùng D* để tìm đường, chắc chắn sẽ có cell bị quét lại

Hình 4.13 Các màu biểu thị mức độ lặp lại

Hình 4.14 Mức độ lặp lại khi ƣu tiên trong tìm kiếm D* theo thứ tự UP-

Hình 4.15 Mức độ lặp lại khi ƣu tiên trong D* theo thứ tự RIGHT-

Có thể thấy mức độ lặp lại trong trường hợp RDLU thấp hơn so với

ULDR Tỉ lệ các cell x1,x2,x3,x4 trong trường hợp ULDR lần lượt là 51%, 31%,

11%, 7% Tỉ lệ các cell x1,x2,x3,x4 trong trường hợp RDLU lần lượt là 52%,

43%, 5%, 0% Điểm quan trọng chính là cell dòng 4, cột 6 Khi robot đến cell này lần đầu tiên, tìm kiếm D* đƣợc gọi Nếu ƣu tiên theo thứ tự ULDR thì nó sẽ tìm ra ngay cell bên trên (dòng 3, cột 6) thỏa mãn điều kiện và sinh đường đến đó và sẽ bỏ qua các cell bên dưới và hệ quả là phải quay lại 1 lần nữa để quét được các cell bên dưới này khiến mức độ lặp lại tăng cao.

Áp dụng thuật toán CCD* vào bài toán iRobot

Áp dụng thuật toán vào mô hình robothút bụ cần phải thỏa mãn một số i, yêu cầu về phần cứng và môi trường như sau:

- Dụng cụ quét sẽ được gắn dưới robot Kích thước dụng cụ quét cần phải lớn hơn hoặc bằng kích thước một cell Mỗi khi robot đi qua một cell, coi nhƣ diện tích cell đó đã đƣợc hút bụi

- Môi trường quét đã được biết trước

Vì ngôn ngữ sử dụng trong ROS là C++ và python, nên tác giả sử dụng ngôn ngữ C++ để triển khai thuật toán cũng nhƣ bài toán iRobot Sử dụng cấu trúc struct để mô tả các cell, trong đó có các biến thể hiện giá trị g, backpoint, visited, overlapped Để lưu trữ dữ liệu bản đồ, tác giả sử dụng một mảng 2 chiều để biểu diễn

Dưới cấu trúc struct, xây dựng một tập các hàm để phục vụ thuật toán như: findNextCell, checkContainOb, getCellPosition Ngoài ra để phục vụ cho bài toán iRobot,ngoài các hàm cơ bản, phải xây dựng các hàm chuyên biệt nhƣ:

- checkSpecialPoint: hàm này sử dụng để tìm các điểm tại đó đường đi gấp khúc Bởi vì để điều khiển robot đi theo đường dẫn thì chỉ cần xác định được các điểm này thôi Từ 2 điểm gâp khúc, có thể suy ra các điểm ở giữa

- findLastCommonPoint: Hàm này sử dụng trong pha replanning, sử dụng để tìm ra điểm chung cuối cùng giữa đường cũ và đường mới Phải tìm được điểm chung này thì mới điều khiển robot quay về đi theo đường mới.

- buildObExtend: Việc sinh đường cho robot giống như việc tìm đường đi cho cell trung tâm cell trung tâm này rõ ràng không thể nằm cách tường một khoảng nhỏ hơn bán kính Vì vậy hàm này sẽ sét tất cả các cell nằm cách tường 1 khoảng nhỏ hơn bán kính là ObExtend Việc này khiến cho việc tính toán sinh đường đơn giản và nhanh chóng hơn.

Kết luận

- Thuật toán CCD* sinh đường bao phủ toàn bộ bản đồ, đáp ứng được yêu cầu bài toán.

- Đường đi của thuật toán sinh ra có lặp lại, mức độ lặp lại tùy thuộc vào nhiều yếu tố: độ phức tạp bản đồ, có gặp vật cản không xác định không…

- Việc áp dụng thuật toán vào bài toán cụ thể iRobot gặp nhiều trường hợp ngoại lệ, đòi hỏi phải có sự xử lý riêng.

CHƯƠNG TRÌNH ĐIỀU KHIỂN IROBOT

Chương trình điều khiển robot hút bụi iRobot

Hình 5.1 Mô hình chung các thành phần trao đổi dữ liệu với nhau phục vụ iRobot

Trong ROS, các node được tổ chức dưới cấu trúc đồ thị Trong bài toán iRobot, tác giả xây dựng một node controller điều khiển các thành phần phối hợp trao đổi dữ liệu với nhau để phục vụ bài toán iRobot Theo thứ tự controller sẽ làm những công việc sau:

1 Lấy dữ liệu bản đồ từ map_server và chuyển dữ liệu này sang bản đồ lưới

2 Sử dụng AMCL để lấy vị trí đầu tiên

4 Tìm specialPoint tiếp theo trong P Gọi AMCL lấy vị trí hiện tại Sinh góc quay và đường đi từ vị trí hiện tại đến specialPoint Nếu P rỗng thì kết thúc

5 Di chuyển đến specialPoint Nếu thành công, lặp lại 4 Nếu phát hiện vật cản trên đường đi, cập nhật bản đồ và đi đến 6.

7 Tìm điểm chung cuối cùng giữa P, P' Sinh đường từ vị trí hiện tại về điểm chung

8 Đi đến điểm chung, nếu thành công, quay về 4 Nếu không thành công, quay về 6 Đầu tiên, robot sẽ lấy dữ liệu bản đồ từ công cụ map_server, chuyển sang mảng 2 chiều, tiến hành loại bỏ phần dƣ thừa, tìm các giá trị biên của bản đồ và chuyển bản đồ sang bản đồ lưới (chuyển mảng 2 chiều số nguyên sang mảng 2 chiều struct cell) Sau khi có bản đồ lưới, gọi công cụ AMCL lấy vị trí hiện tại làm đầu vào cho thuật toán Pha initial complete được gọi sinh ra đường P Trong

P, sẽ chỉ quan tâm đến các vị trí tại đó đường đi gấp khúc (specialPoint) bởi vì muốn robot di chuyển theo đường thì chỉ cần tọa độ của các specialPoint này thôi.

Tiếp theo, robot tìm specialPoint, lấy vị trí hiện tại từ AMCL, sinh góc quay và sinh quãng đường, điều khiển robot theo 2 tham số góc quay và quãng đường Quá trình này liên tục lặp lại đến khi hết P.

Nếu trong quá trình di chuyển phát hiện vật cản thì dựa vào dữ liệu laser, controller sẽ xác định đƣợc cell nào có vật cản, từ đó update map, pha replanning sẽ đƣợc gọi.

Xác định điểm chung giữa hai đường cũ, mới để tiến hành quay về điểm chung này, quay về điểm chung thì mới đi theo đường mới được

5.1.2 Hàm xử lý phát hiện vật cản

Trong pha replanning, làm thế nào để robot xác định đƣợc vật cản Từ dữ liệu laser và vị trí robot, cần xác định được trên bản đồ lưới, cell nào đang là vật cản Hàm laserHander sẽ xử lý việc đó Đây là hàm chạy đa luồng chạy song song với chương trình chính, chỉ có nhiệm vụ liên tục quét laser, nếu phát hiện vật cản, thông báo cho chương trình chính để chương trình chính có hướng xửlý

Hình 5.2 Vùng phát hiện vật cản của laser Đầu tiên, làm thế nào robot phát hiện vật cản, chỉ cần sét, nếu một tia laser trả dữ liệu nhỏ hơn 1 trị số nào đó gọi là phạm vi phát hiện vật cản thì controller sẽ hiểu robot đang gặp vật cản Tuy nhiên, nếu robot đi men theo tường, các tia số 0 và 720 sẽ có thể phát hiện tường là vật cản, lúc này phải xử lý các trường hợp ngoại lệ Thay vì duyệt cả 720 tia, chia vùng quét detect OB và not detect

OB cho phù hợp nhất Để tránh phức tạp, hàm laserhander chỉ xử lý dữ liệu khi robot di chuyển

Nếu phát hiện vât cản, một khóa sẽ đƣợc thiết lập để tránh các luồng đến sau cũng nhảy vào gây lỗi, đồng thời thông báo cho controller đã phát hiện vật cản, nhảy ra khỏi hàm go và đợi laserHander xử lý xong LaserHander sẽ xác định vật cản, cập nhật bản đồ Xong việc sẽ thông báo cho controller để controller chạy pha replanning.

Các trường hợp ngoại lệ

Việc xây dựng một hệ thống robot chạy trong thực tế không tránh khỏi những trường hợp ngoại lệ phát sinh khiến robot di chuyển sai số hoặc gây lỗi cho thuật toán Để xử lý những trường hợp này, tác giả có xây dựng các hàm xử lý riêng hoặc sửa thuật toán để áp dụng đƣợc vào bài toán iRobot Trong phần này sẽ trình bày một số ngoại lệ điển hình

5.2.1 Robot di chuyển không chính xác

Robot di chuyển không chính xác, có xuất hiện sai số Ví dụ, điều khiển robot đi 1 mét, robot sẽ đi sai số + 5cm Điều khiển quay 90 độ thì có thể robot - sẽ quay 89, 91 độ Điều này đã đƣợc kiểm tra cả trên giả lập lẫn thực tế Mặc dù sai số nhỏ, nhƣng nếu không xử lý, sai số sẽ cộng dồn vào những lần di chuyển tiếp theo khiến robot lệch hẳn đường đi Ngoài ra lỗi này còn gây ra việc nhâm lẫn giữa việc xác định vật cản cố định và vật cản di dộng nữa.

Nguyên nhân có sự sai số này là do robot có khối lƣợng nên có quán tính

Lệnh stop không thể khiến robot dừng ngay lập tức Giống như người đi xe máy đến đèn đỏ mới bóp phanh thì không thể dừng ngay tại vạch đƣợc Nguyên nhân thứ hai là do trong hàm go và turn, mỗi lần pushlish thông tin lên topic /velocity sẽ khiến robot di chuyển, quay một lƣợng nhất định Vì vậy không thể có cách nào điều khiển robot di chuyển hoặc quay chính xác tuyệt đối tham số đầu vào, chỉ có thể giảm sai số xuống mức thấp nhất.

➢ Giải pháp: trong quá trình nghiên cứu, tác giả nhận thấy sai số này phụ thuộc rất lớn vào tốc độ robot Tốc độ càng lớn, sai số càng cao, tốc độ nhỏ, sai số nhỏ Phương án đưa ra là kiểm tra khi càng gần về đích thì giảm tốc độ theo một tỉ lệ nào đó để đến khi về đích, tốc độ đủ nhỏ để sai số nhỏ đến mức chấp nhận đƣợc Tuy nhiên, cũng cần điều chỉnh để quá trình di chuyển không quá lâu (bởi vì tốc độ nhỏ nên thời gian di chuyển sẽ lâu) Điều này nếu so với thực tế thì cũng đúng Khi đi xe máy, muốn dừng tại điểm A, phải giảm tốc độ trước khi đến A, chay chậm dần để khi về A, tốc độ bằng 0

5.2.2 AMCL trả dữ liệu chậm

Thuật toán AMCL trả dữ liệu chậm gây ra lỗi tính toán không chính xác vị trí robot

Hình 5.3 AMCL trả dữ liệu chậm gây sai số trong khi quay

Robot cần di chuyển theo đường ABC khi robot thực sự đã đến B, nhưng do AMCL trả dƣ liệu chậm, nói với controller rằng robot đang ở B' Controller sẽ tính toán góc quay và quãng đường từ dữ liệu AMCL trả về B' và nextCell C

Controller sẽ điều khiển robot theo góc quay và quãng đường này Vì vậy, thay vì đi đến C, robot lại đi đến C'.

Nguyên nhân của lỗi này là do AMCL phải xử lý một lƣợng thông tin lớn dẫn đến xử lý lâu nhƣng đây chỉ là nguyên nhân nhỏ Nguyên nhân phần lớn là do AMCL không có đủ thông tin từ môi trường Trong quá trình nghiên cứu, tác giả nhận thấy, AMCL trả dữ liệu rất nhanh khi robot quay và trả chậm khi robot đi thẳng Điều này cũng đúng khi quay thì dữ liệu từ môi trường nhận được nhiều hơn, quá trình hội tụ xảy ra nhanh, trong khi đi thẳng, dữ liệu từ môi trường không có nhiều sự thay đổi, quá trình hội tụ xảy ra chậm

➢ Giải pháp: trong hàm turn, vừa quay vừa lấy dữ liệu từ AMCL điều khiển , quay góc anpha đến nextCell, tuy nhiên anpha không phải tính toán từ trước rồi truyền cho hàm turn, mà anpha sẽ luôn luôn được tính toán lại bên trong hàm turn Ban đầu có thể anpha sẽ đƣợc tính toán sai, nhƣng chỉ cần robot quay 1 góc nhỏ ban đầu đủ để AMCL trả dữ liệu chính xác thì anpha sẽ đƣợc tính toán lại, điều kiện dừng sẽ đƣợc thay đổi Hàm turn thay vì truyền tham số góc muốn quay thì sẽ truyền tọa độ cell muốn quay đến.

Nhƣ đã trình bày trong mục một, laser Hokuyo có sai số +-5cm Việc này gây lỗi trong quá trình xác định vật cản (sai số trong 1 cell) Giả sử cell bị nhầm là vật cản này đã được thăm (visittedR), thì khi pha replanning được gọi, đường đi sẽ khác nhau ngay tại cell này Điều này dẫn đến có thể sẽ không tìm đƣợc điểm chung giữa đường cũ và mới hoặc nêu tìm được, có thể sẽ không sinh được đường quay về

Hình 5.4 Laser phát hiện vật cản không chính xác

➢ Giải pháp: trong hàm laserhander, khi xác định vật cản còn phải kiểm tra điều kiện cell đó đã visited hay chƣa Nếu đã visited thì sẽ bỏ qua cell đó.

Kết luận

- Với 4 kịch bản điều khiển (quét bình thường trên môi trường giả lập và thực tế, quét có vật cản không xác định trên môi trường giả lập và thực tế) Chương trình điều khiển thành công robot đi theo đường dẫn do thuật toán sinh ra phủ kín bản đồ, tránh vật cản thành công và lập lại được đường đi

- Tuy nhiên robot di chuyển còn chậm chập, giật, không mƣợt

- Chương trình chưa phủ hết được các trường hợp ngoại lệ có thể xẩy ra, thường khi phát hiện ra một trường hợp nào đó gây lỗi phải xử lý riêng

- Cài đặt thành công ROS phiên bản indigo và môi trường giả lập Gazebo trên hệ điều hành Ubuntu 14.04 Tìm hiểu đƣợc các công cụ cơ bản của

- Tìm hiểu về công cụ hector_slam và gmapping trong việc xây dựng bản đồ.

- Chuyển đổi bản đồ sang dạng lưới

- Nghiên cứu thuật toán CCD*và triển khai trên ngôn ngữ C++.

- Tìm hiểu về thuật toán định vị AMCL, và sử dụng thành công công cụ amcl trong việc định vị robot trên bản đồ lưới.

- Tập trung nghiên cứu việc điều hướng robot, giúp việc di chuyển của robot đƣợc chính xác.

- Kiến thức về lập trình nhúng còn thiếu sót, hiệu năng và tốc độ xử lý robot chƣa thỏa mãn yêu cầu trong điều kiện khắc nghiệt.

- Việc xây dựng bản đồ vẫn còn độ sai số tương đối, phải quét lại bản đồ khá nhiều lần để đạt đƣợc độ chính xác

- Việc di chuyển vẫn chưa thực sự hoàn toàn chính xác trong môi trường rộng lớn.

- Vẫn chƣa tìm hiểu đƣợc nhiều các công cụ của ROS.

- Nghiên cứu cải thiện thuật toán giảm được mức độ lặp lại của đường dẫn

- Triển khai trên các hệ thống nhúng

- Tiếp tục nghiên cứu, cải tiến controller để có thể bao phủ, xử lý đƣợc nhiều trường hợp ngoại lệ hơn.

Ngày đăng: 26/01/2024, 16:12

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w