Điều khiển PID với TurtleSim
Tóm tắt
Move Turtle là một script Python ROS đơn giản giúp di chuyển con rùa trong TurtleSim của ROS tới các tọa độ (điểm) xác định. Dự án này bắt đầu như một dự án lớp cho CSCI473 tại Colorado School of Mines (CSOM) và sau đó phát triển thành một dự án mà tôi dùng để giúp mình học cách tạo ra các hệ thống vòng kín, kiến thức từ đó đã hỗ trợ tôi trong công việc tại Phòng thí nghiệm Robot Tập trung Con người (HCR) của CSOM.
Bối cảnh
Để có chút nền tảng, ROS là viết tắt của Hệ điều hành Robot. ROS là một phần mềm trung gian (middleware) mã nguồn mở cho robot, thường được kết hợp với hệ điều hành Ubuntu, được dùng để quản lý tốt hơn các thành phần/ cụm phần mềm của một hệ thống robot. Bạn có thể tìm hiểu thêm về cách sử dụng ROS thông qua wiki chính thức của ROS. Mã bạn viết trong ROS có thể là C++ hoặc Python.
TurtleSim là một trình mô phỏng robot 2D đơn giản được dùng như một phần giới thiệu về ROS và các gói ROS cho người mới. Tất cả TurtleSim làm là mở một màn hình 2D đơn giản với một con rùa. Con rùa đó đóng vai trò là “robot” và bạn có thể gửi các thông điệp tới “robot” đó để di chuyển và/hoặc quay. Khi di chuyển, TurtleSim tạo ra một số lỗi ngẫu nhiên để mô phỏng vật lý thực tế một cách đơn giản.
Biết ROS và TurtleSim là gì, tại sao tôi lại dùng chúng? Vào Học kỳ Spring 2020 tôi đang học một lớp gọi là “Human Centered Robotics” tại Colorado School of Mines như một phần của chương trình cử nhân khoa học máy tính. Lớp học do Tiến sĩ Hao Zhang giảng dạy. Lớp gồm ba dự án và dự án đầu tiên bao gồm việc thiết lập ROS, học cách sử dụng ROS, và triển khai một thuật toán mở vòng hoặc vòng kín để làm cho con rùa trong TurtleSim vẽ chữ M. Mô tả dự án gốc có thể được xem TẠI ĐÂY.
Khi tôi học lớp đó, tôi hoàn thành dự án này bằng cách triển khai một thuật toán mở vòng. Giải pháp này hoạt động nhưng nó thực sự tệ và vẽ một chữ A mà “đủ tốt” nhưng không hề “tuyệt”. Sau khi nộp dự án vào khoảng giữa tháng Hai 2020, tôi đã quên nó cho đến một năm sau vào khoảng tháng Hai 2021.
Thách thức
Vào tháng Hai 2021, tôi được tuyển làm Trợ lý Nghiên cứu tại Phòng thí nghiệm Robot Tập trung Con người (HCR) ở Colorado School of Mines, nơi tôi làm việc dưới sự hướng dẫn của Tiến sĩ Hao Zhang. Mục tiêu của phòng thí nghiệm là nghiên cứu “độc lập hợp tác suốt đời, với mục tiêu cho phép robot hoạt động và thích nghi trong thời gian dài”. Tính đến ngày 1-9-2022 (1 tháng 9, 2022), phòng thí nghiệm đã chuyển từ Colorado School of Mines đến University of Massachusetts Amherst. Nhưng khi tôi làm ở đó họ vẫn còn ở Colorado.
Tại HCR Lab, nhiệm vụ đầu tiên của tôi là làm việc trên dự án Triton. Dự án Triton bao gồm nhiều, hàng chục, robot gọi là Triton. Triton là các robot nền đất có ba bánh bánh xe omni hình tam giác trông như thế này:
Cùng với Triton, tám camera hồng ngoại từ OptiTrack được sắp xếp theo “thứ tự bát giác” vài feet trên mặt đất. Sử dụng những camera đó, phần mềm Motive của OptiTrack, một máy tính chạy Windows 10, và ROS; một không gian 2 mét x 2 mét x 2 mét (x, y, z) được tạo ra nơi vị trí thực tế chính xác của các vật thể mang mốc bắt chuyển động có thể được xác định.
Nhiệm vụ đầu tiên của tôi với dự án Triton là viết các script khiến robot Triton di chuyển tới một vị trí thực tế cụ thể. Lúc đó, tôi không chắc làm thế nào để đạt được điều này nhưng tôi nhớ dự án đầu tiên từ CSCI473 nơi ý tưởng về một hệ thống vòng kín đã được giới thiệu, vì vậy tôi bắt đầu nghiên cứu sâu về hệ thống vòng kín và hệ thống phản hồi.
Nghiên cứu
Trong quá trình nghiên cứu, tôi phát hiện ra video tuyệt vời này của AerospaceControlsLab:
Trong video này, ý tưởng về hệ thống PID được trình bày và giải thích cho tôi. Một hệ thống PID là một hệ thống vòng kín, vòng điều khiển, tạo ra các đầu ra cụ thể dựa trên dữ liệu từ thế giới thực. Nói một cách cơ bản, nó là một hệ thống phản hồi điều chỉnh đầu ra dựa trên sự khác biệt giữa giá trị mong muốn và giá trị đo được. Đây là công thức cho bộ điều khiển PID:
$$ u(t) = K_p e(t) + K_i \int e(t) dt + K_d \frac{de(t)}{dt} $$
- $u(t)$ là tín hiệu điều khiển.
- $K_p$, $K_i$, $K_d$ lần lượt là các hệ số điều chỉnh tỉ lệ, tích phân và đạo hàm.
- $e(t)$ là tín hiệu sai số (hiệu giữa đầu ra mong muốn và đầu ra thực tế).
- $\int e(t) dt$ là tích phân của sai số theo thời gian.
- $\frac{de(t)}{dt}$ là đạo hàm của sai số.
Để tìm hiểu thêm, hãy xem video của AerospaceControlsLab hoặc bài viết tuyệt vời này trên Wikipedia mà công thức lấy từ đó.
Sau khi nghiên cứu và nhận được một số trợ giúp từ bạn bè thông minh và các giáo sư, tôi xác định rằng sử dụng một Bộ điều khiển Tỉ lệ, Bộ điều khiển P, sẽ là phương án tốt nhất để giúp Triton đạt tới tọa độ cụ thể.
Vì Triton là một robot nền đất, tôi chỉ cần quan tâm tới tọa độ X và Y. Biết điều này, tôi sau đó phải xác định các giá trị mong muốn và các giá trị đo để đo và xử lý trong các Bộ điều khiển P. Trong nghiên cứu của mình tôi tìm thấy một bài đăng tuyệt vời trên wiki ROS có tên Go to Goal nơi họ tập trung vào các sai số sau:
- Sai số khoảng cách: Hiệu sai khác về khoảng cách giữa vị trí mong muốn (X, Y) và vị trí hiện tại (X, Y).
- Sai số Theta: Hiệu sai khác giữa hướng mong muốn và hướng hiện tại.
Giải pháp đề xuất
Biết tất cả những điều này, giải pháp để khiến Triton di chuyển tới một tọa độ thực tế cụ thể là sử dụng một Bộ điều khiển Tỉ lệ cho sai số khoảng cách và sai số theta của Triton đối với tọa độ mục tiêu và tọa độ hiện tại của Triton. Nhưng trước khi triển khai điều này vào một hệ thống vật lý, tôi muốn kiểm tra ý tưởng trong mô phỏng và, vào thời điểm đó, tôi nghĩ sử dụng TurtleSim làm mô phỏng là lựa chọn tốt nhất.
Kiểm thử trong Mô phỏng
Với giải pháp lý thuyết đã được phác thảo, tôi chọn xác thực ban đầu thông qua mô phỏng, thay vì kịch bản thế giới thực. Thế giới thực thường nhiều nhiễu có thể làm mờ hiệu quả của giải pháp và dẫn đến phải xử lý các vấn đề không liên quan. Nhận thức điều này, tôi đã xem lại dự án CSCI473 cũ của mình và điều chỉnh nó như một môi trường thử nghiệm cho giải pháp lý thuyết này.
Sau khi cập nhật mã cũ từ ROS Melodic lên ROS Noetic và qua một số cải tiến lặp đi lặp lại, tôi đã khiến giải pháp đề xuất hoạt động trong TurtleSim. Các minh họa về chức năng của nó, với một số đường đi tọa độ mục tiêu thú vị, có thể được tìm thấy ở cuối bài đăng blog này. Mã cho tất cả những điều này có thể được xem TẠI ĐÂY.
Kết luận
Tóm lại, thông qua dự án này, con rùa trong TurtleSim đã điều hướng hiệu quả tới các tọa độ được đặt trước bằng hệ thống vòng kín, vượt trội đáng kể so với hệ thống mở vòng ban đầu của tôi từ năm 2020. Sau khi thử nghiệm thành công, tôi đã triển khai giải pháp này với các robot Triton. Nhưng nhiễu trong thế giới thực đã giới thiệu các vấn đề bất ngờ đòi hỏi hàng tuần để gỡ lỗi và thử nghiệm thực tế. Sau những tuần đó, cuối cùng tôi đã khiến Triton đạt được các tọa độ thực tế cụ thể bằng cách sử dụng chính giải pháp mà tôi đã thử nghiệm trong TurtleSim. Đây là một demo về Triton di chuyển tới các tọa độ thực tế cụ thể bằng phương pháp đã thử nghiệm trong TurtleSim:
Nhìn lại, tôi ước mình đã dùng một mô phỏng mô phỏng vật lý thực tế tốt hơn. TurtleSim rất tốt để học nhưng không tốt để thử nghiệm các ý tưởng robot thế giới thực. Khi đó, tôi nghĩ nó sẽ đủ cho trường hợp sử dụng đơn giản của mình nhưng sau đó đã chứng minh là không như vậy.
Mục tiêu chính của bài đăng blog này là phác thảo việc tạo ra một hệ thống vòng kín cho phép con rùa trong TurtleSim, và sau đó các robot Triton, điều hướng chính xác tới các vị trí mục tiêu (X, Y) được chỉ định. Tôi tin rằng mục tiêu này đã đạt được, và nó có thể đã thu hút sự quan tâm đến công việc của tôi tại HCR Lab. Biết điều này, tôi có kế hoạch viết thêm các bài đăng blog về kinh nghiệm làm việc của mình tại HCR Lab…
Các bản demo Move Turtle (TurtleSim)
Video này chứa các demo sau:
- Cayley Nodal: Một thiết kế Cayley Nodal đơn giản
- Circles: Một thiết kế giống mạng nhện
- Inner Circles: Một thiết kế “vòng tròn lồng vào nhau”
- M: Một thiết kế chữ M rất đơn giản