Học robot¶
Học robot thu hẹp khoảng cách giữa các thuật toán và hành động vật lý. File này bao quát động học robot, động lực học, điều khiển cổ điển, học bắt chước, chuyển giao từ mô phỏng sang thực tế, thao tác, di chuyển và an toàn — những kỹ thuật giúp robot có khả năng di chuyển, cầm nắm, đi lại và tương tác với thế giới thực.
-
Ở các chương trước, ta đã học cách nhận thức thế giới (chương 8, file 1 chương 11) và cách học từ dữ liệu (chương 6). Nhưng nhận thức và học tập là chưa đủ. Một con robot phải hành động: di chuyển cánh tay để cầm một chiếc cốc, đi qua địa hình gồ ghề, hoặc dạo quanh một kho hàng. Đó là lúc học robot xuất hiện.
-
Thách thức trung tâm là thế giới vật lý liên tục, nhiều chiều, giàu tiếp xúc và không khoan nhượng. Một lỗi phân lớp trong nhận dạng ảnh chỉ là một nhãn sai. Một lỗi điều khiển trong robot học là một con robot gãy hoặc một vật thể bị rơi. Cái giá phải trả là khác nhau.
Động học robot¶
-
Động học (kinematics) mô tả hình học của chuyển động mà không xét đến lực. Một cánh tay robot là một chuỗi các khâu cứng nối với nhau bằng các khớp. Mỗi khớp có một bậc tự do (DoF): hoặc xoay (khớp bản lề), hoặc trượt (khớp trượt).
-
Cấu hình của một robot là tập hợp tất cả các góc khớp (hoặc độ tịnh tiến) \(\\mathbf{q} = [q_1, q_2, \\ldots, q_n]^T\). Vector này nằm trong không gian khớp (hay không gian cấu hình), một không gian \(n\) chiều mà mỗi trục tương ứng với một khớp.
-
Động học thuận (FK) tính vị trí và hướng của cơ cấu cuối (cái "bàn tay") từ các góc khớp. Đây là một hàm \(\\mathbf{x} = f(\\mathbf{q})\) ánh xạ từ không gian khớp sang không gian tác vụ (vị trí và hướng 3D của cơ cấu cuối, còn gọi là không gian Descartes).
-
Mỗi khớp được mô tả bởi một ma trận biến đổi thuận nhất \(4 \\times 4\) (nhắc lại các phép biến đổi affine từ chương 2). Quy ước Denavit-Hartenberg (DH) tham số hóa mỗi khớp bằng bốn con số: chiều dài khâu \(a\), độ xoắn khâu \(\\alpha\), độ lệch khâu \(d\), và góc khớp \(\\theta\). Phép biến đổi cho khớp \(i\) là:
-
Động học thuận đầy đủ là tích của tất cả các phép biến đổi khớp: \(T_{0 \\to n} = T_1 T_2 \\cdots T_n\). Đây là phép nhân ma trận nối chuỗi các biến đổi (chương 2): phép biến đổi của mỗi khớp được áp dụng lần lượt, xoay và tịnh tiến hệ tọa độ từ gốc đến cơ cấu cuối.
-
Động học nghịch (IK) là bài toán ngược: cho một tư thế cơ cấu cuối mong muốn \(\\mathbf{x}^*\), tìm các góc khớp \(\\mathbf{q}\) sao cho \(f(\\mathbf{q}) = \\mathbf{x}^*\). Điều này khó hơn nhiều vì:
- Phép ánh xạ là phi tuyến (chứa sin và cos).
- Có thể có nhiều nghiệm (các cấu hình tay khác nhau chạm tới cùng một điểm).
- Có thể không có nghiệm (mục tiêu nằm ngoài tầm với).
-
Các nghiệm phân tích chỉ tồn tại cho những cấu hình robot cụ thể. Với robot tổng quát, IK được giải lặp bằng ma trận Jacobi (Jacobian). Jacobian \(J(\\mathbf{q})\) liên hệ những thay đổi nhỏ của góc khớp với những thay đổi nhỏ của vị trí cơ cấu cuối (nhắc lại Jacobian từ chương 3):
-
Để di chuyển cơ cấu cuối một lượng nhỏ \(\\Delta \\mathbf{x}\), ta cần \(\\Delta \\mathbf{q} = J^{-1} \\Delta \\mathbf{x}\) (hoặc \(J^+ \\Delta \\mathbf{x}\) dùng ma trận giả nghịch đảo khi \(J\) không vuông). Điều này được lặp cho đến khi cơ cấu cuối chạm mục tiêu, về cơ bản là phương pháp Newton (chương 3) áp dụng cho phương trình động học.
-
Gần các kỳ dị (singularities), Jacobian mất hạng (một số cột trở nên phụ thuộc tuyến tính, như ta đã học ở chương 2). Về mặt vật lý, điều này nghĩa là robot mất một bậc tự do: dù các khớp xoay nhanh thế nào, cơ cấu cuối cũng không thể di chuyển theo một số hướng nhất định. Ma trận giả nghịch đảo "nổ" gần các kỳ dị, nên người ta dùng bình phương tối thiểu có suy giảm (damped least-squares, thêm một số hạng chính quy \(\\lambda^2 I\)) thay thế:
Động lực học và Điều khiển¶
- Động lực học (dynamics) thêm lực vào bức tranh. Các phương trình chuyển động cho một cánh tay robot tuân theo phương trình cơ cấu:
-
với \(M(\\mathbf{q})\) là ma trận khối lượng (quán tính), \(C(\\mathbf{q}, \\dot{\\mathbf{q}})\) nắm bắt các hiệu ứng Coriolis và ly tâm, \(\\mathbf{g}(\\mathbf{q})\) là vector trọng trường, và \(\\boldsymbol{\\tau}\) là vector các mô-men khớp (đầu vào điều khiển). Đây là một hệ các phương trình vi phân thường bậc hai, một phương trình cho mỗi khớp.
-
Ma trận khối lượng \(M\) luôn đối xứng và xác định dương (nhắc lại từ chương 2 rằng các ma trận xác định dương bảo đảm một cực tiểu duy nhất, ở đây nó bảo đảm hệ phản ứng dự đoán được với các mô-men được áp dụng).
-
Điều khiển PID là bộ điều khiển được dùng phổ biến nhất trong robot. Với mỗi khớp, nó tính một mô-men dựa trên sai số \(e(t) = q_{\\text{desired}}(t) - q_{\\text{actual}}(t)\):
- Ba số hạng có vai trò trực quan:
- Tỷ lệ (\(K_p\)): hiệu chỉnh tỷ lệ với sai số hiện tại. Sai số lớn hơn → hiệu chỉnh lớn hơn. Giống như một lò xo kéo khớp về phía mục tiêu.
- Tích phân (\(K_i\)): tích lũy các sai số quá khứ để loại bỏ độ lệch trạng thái tĩnh. Nếu khớp liên tục bị thiếu hụt, số hạng tích phân tích lũy và cung cấp thêm lực đẩy.
- Đạo hàm (\(K_d\)): phản ứng với tốc độ thay đổi của sai số, cung cấp sự giảm chấn. Nó làm chậm phản ứng khi sai số giảm, ngăn quá điều chỉnh và dao động.
-
Tinh chỉnh \(K_p, K_i, K_d\) là một sự cân bằng: quá nhiều \(K_p\) gây dao động, quá nhiều \(K_d\) làm hệ ì ạch, quá nhiều \(K_i\) gây tích lũy vô hạn (integral wind-up).
-
Điều khiển dự đoán theo mô hình (MPC) nhìn trước. Ở mỗi bước thời gian, nó giải một bài toán tối ưu: tìm chuỗi các điều khiển tương lai sao cho tối thiểu hóa một hàm chi phí (ví dụ: sai số bám sát + công điều khiển) trên một chân trời hữu hạn, tuân theo mô hình động lực học và các ràng buộc. Chỉ điều khiển đầu tiên được áp dụng, rồi quy trình lặp lại ở bước thời gian tiếp theo.
-
Ở đây \(\\|\\mathbf{x}\\|_Q^2 = \\mathbf{x}^T Q \\mathbf{x}\) là một chuẩn có trọng số dùng ma trận xác định dương \(Q\) (chương 2), cho phép phạt các sai số trạng thái khác nhau ở mức độ khác nhau. MPC xử lý tự nhiên các ràng buộc (giới hạn khớp, giới hạn mô-men, tránh chướng ngại) vì chúng được đưa vào tối ưu hóa một cách tường minh.
-
Điều khiển trở kháng (impedance control) điều chỉnh mối quan hệ giữa lực và chuyển động thay vì bám sát một quỹ đạo cứng nhắc. Thay vì ra lệnh "đi đến vị trí \(x\)", nó ra lệnh "hãy hành xử như một hệ lò xo-giảm chấn có tâm tại \(x\)":
- với \(K_s\) là ma trận độ cứng và \(D\) là ma trận giảm chấn. Điều này làm robot tuân theo (compliant): nếu nó chạm một chướng ngại, nó nhường nhịn thay vì ép buộc đi qua. Điều khiển trở kháng là thiết yếu cho các tác vụ giàu tiếp xúc như lắp một chốt vào lỗ hoặc đưa một vật cho người.
Học bắt chước¶
-
Thay vì tự thiết kế các bộ điều khiển, ta có thể học các chính sách điều khiển từ các minh chứng. Một con người thực hiện tác vụ, robot quan sát, và một thuật toán học trích xuất một chính sách. Đây là học bắt chước (imitation learning, hay học từ minh chứng).
-
Nhân bản hành vi (BC) là cách tiếp cận đơn giản nhất: coi các minh chứng như một tập dữ liệu học có giám sát. Từ các cặp quan sát-hành động \(\\{(\\mathbf{o}_t, \\mathbf{a}_t)\\}\) của một chuyên gia, huấn luyện một chính sách \(\\pi_\\theta(\\mathbf{a} \\mid \\mathbf{o})\) để dự đoán hành động của chuyên gia từ quan sát. Đây là học có giám sát chuẩn (chương 6): tối thiểu hóa hàm mất mát:
-
Vấn đề là sự dịch chuyển phân bố (còn gọi là vấn đề lỗi cộng dồn). Trong huấn luyện, chính sách thấy các trạng thái của chuyên gia. Trong triển khai, những lỗi nhỏ của chính sách đẩy nó vào các trạng thái mà chuyên gia chưa từng ghé thăm. Những trạng thái lạ lẫm dẫn đến các hành động tệ hơn, gây ra những trạng thái lạ lẫm hơn nữa, và lỗi cộng dồn nhanh chóng.
-
Hãy hình dung học lái xe bằng cách quan sát một tài xế hoàn hảo. Bạn chưa bao giờ thấy điều gì xảy ra sau một cú lệch nhẹ, vì chuyên gia không bao giờ lệch. Lần đầu bạn trệch một chút, bạn chẳng biết cách khôi phục.
-
DAgger (Dataset Aggregation — Tập hợp tập dữ liệu) giải quyết việc này bằng cách lặp:
- Huấn luyện một chính sách trên dữ liệu hiện tại.
- Chạy chính sách trong môi trường, thu thập các trạng thái mới.
- Nhờ chuyên gia gán nhãn cho các trạng thái mới này bằng hành động đúng.
- Thêm dữ liệu mới vào tập và huấn luyện lại.
-
Qua các vòng lặp, tập dữ liệu bao phủ các trạng thái mà chính sách học được thực sự ghé thăm, không chỉ quỹ đạo của chuyên gia. Chính sách cải thiện vì nó đã thấy và học được cách phục hồi từ chính những lỗi của mình.
-
Gộp hành động bằng Transformer (ACT) là một cách tiếp cận hiện đại, trong đó chính sách dự đoán một chuỗi các hành động tương lai (một "đoạn") thay vì từng hành động một lúc. Nó được triển khai dùng một VAE có điều kiện với backbone là transformer. Dự đoán các đoạn hành động bền vững hơn vì nó nắm bắt được tương quan theo thời gian: sự mượt mà của một cử động với tới được mã hóa trong đoạn thay vì dựa vào các dự đoán từng bước tự hồi quy có thể bị trôi.
-
Chính sách khuếch tán (Diffusion Policy) áp dụng các mô hình khuếch tán (chương 8) vào việc sinh hành động. Thay vì dự đoán một hành động đơn, nó mô hình hóa toàn bộ phân bố các hành động có thể có với điều kiện là quan sát. Bắt đầu từ nhiễu, nó lần lượt khử nhiễu để sinh ra một chuỗi hành động. Cách này xử lý tính đa phương thức (multimodality) một cách tự nhiên: khi có nhiều cách hợp lệ để hoàn thành một tác vụ (với tới từ trái hay từ phải), mô hình khuếch tán có thể biểu diễn cả hai mode, trong khi một chính sách hồi quy sẽ lấy trung bình chúng (và chạm tới một điểm ở giữa, có thể không hợp lệ).
Chuyển giao từ mô phỏng sang thực tế¶
-
Huấn luyện robot trong thế giới thực thì đắt đỏ, chậm và nguy hiểm. Một con robot học cầm nắm bằng thử và sai có thể mất hàng nghìn lần thử, làm gãy đồ vật và chính nó dọc đường. Mô phỏng cung cấp trải nghiệm không giới hạn, an toàn và nhanh chóng. Nhưng các trình mô phỏng thì không hoàn hảo: vật lý được xấp xỉ, hình ảnh là nhân tạo, các tiếp xúc được đơn giản hóa.
-
Khoảng cách mô phỏng-thực tế (sim-to-real gap) là sự khác biệt giữa hiệu suất trong mô phỏng và thực tế. Một chính sách hoạt động hoàn hảo trong mô phỏng có thể thất bại hoàn toàn trên robot thật vì nó đã quá khớp (overfit) vào các chi tiết riêng của trình mô phỏng.
-
Làm ngẫu nhiên miền (domain randomisation) chống lại điều này bằng cách huấn luyện trên một dải rộng các thiết lập mô phỏng. Thay vì một mô phỏng, hãy dùng hàng nghìn mô phỏng với:
- Vật lý: hệ số ma sát, khối lượng, giảm chấn
- Hình ảnh: ánh sáng, kết cấu, màu sắc, vị trí camera
- Động lực học: độ trễ động cơ, mức nhiễu
-
Ý tưởng là nếu chính sách hoạt động trên tất cả các biến thể này, thế giới thực chỉ là "một biến thể khác" trong phân bố. Chính sách học được các đặc trưng bất biến với các thuộc tính đã làm ngẫu nhiên, và những đặc trưng bất biến này chuyển giao được.
-
Định danh hệ thống (system identification) đi theo hướng ngược lại: thay vì làm ngẫu nhiên tất cả, hãy đo cẩn thận các tham số vật lý của hệ thực và tinh chỉnh trình mô phỏng để khớp. Cách này cho một mô phỏng chính xác hơn nhưng dễ vỡ (bất kỳ hiệu ứng nào chưa được mô hình hóa đều gây ra khoảng cách).
-
Trong thực tế, kết quả tốt nhất kết hợp cả hai: định danh hệ thống để đưa trình mô phỏng đủ gần, rồi làm ngẫu nhiên miền để bao phủ phần bất định còn lại.
-
Sim-to-real qua tinh chỉnh chủ yếu huấn luyện trong mô phỏng, rồi thực hiện một lượng nhỏ tinh chỉnh trong thế giới thực. Mô phỏng cung cấp một khởi tạo tốt, và dữ liệu thực tế hiệu chỉnh các thiên kiến riêng của trình mô phỏng. Cách này đòi hỏi ít dữ liệu thực tế hơn nhiều so với huấn luyện từ đầu.
Các mô hình thế giới cho robot¶
-
Tất cả các cách tiếp cận RL và học bắt chước ở trên đều không dùng mô hình (model-free): chính sách học hành động qua tương tác trực tiếp (hoặc minh chứng) mà không mô hình hóa tường minh thế giới hoạt động ra sao. Một lựa chọn khác là học dựa trên mô hình: trước tiên học một mô hình về động lực học của môi trường, rồi dùng mô hình đó để lập kế hoạch hoặc sinh trải nghiệm nhân tạo.
-
Một mô hình thế giới học hàm chuyển trạng thái \(p(s_{t+1} \\mid s_t, a_t)\): cho trạng thái hiện tại và một hành động, dự đoán trạng thái tiếp theo (như đã giới thiệu ở chương 10). Trong robot, điều này nghĩa là dự đoán điều gì sẽ xảy ra nếu robot thực hiện một hành động cụ thể: "nếu tôi đẩy khối này sang trái, nó sẽ trượt 3cm và cái cốc phía sau sẽ đổ".
-
Sức hấp dẫn nằm ở hiệu quả lấy mẫu. Tương tác robot với thế giới thực thì đắt đỏ. Nếu robot có thể học một mô hình thế giới từ một lượng khiêm tốn dữ liệu thực, nó có thể "tưởng tượng" hàng nghìn quỹ đạo bằng cách triển khai mô hình trong đầu, lập kế hoạch và tinh chỉnh chính sách mà không chạm vào thế giới vật lý. Điều này tương tự như cách một kỳ thủ cờ vua tính trước bằng cách mô phỏng các nước đi trong đầu.
-
DreamerV3 là một tác tử RL dựa trên mô hình đa dụng. Nó học ba thành phần cùng nhau:
- Một mô hình biểu diễn mã hóa các quan sát thành một trạng thái tiềm ẩn nhỏ gọn.
- Một mô hình chuyển (chính là mô hình thế giới) dự đoán trạng thái tiềm ẩn tiếp theo từ trạng thái và hành động hiện tại.
- Một mô hình phần thưởng dự đoán phần thưởng từ trạng thái tiềm ẩn.
-
Tác tử sau đó "mơ" bằng cách triển khai mô hình chuyển nhiều bước trong không gian tiềm ẩn, huấn luyện một chính sách trên những quỹ đạo tưởng tượng này, và chuyển giao chính sách sang môi trường thực. Đổi mới then chốt là mọi sự tưởng tượng đều diễn ra trong không gian tiềm ẩn (các biểu diễn học được nhỏ gọn), không phải trong không gian điểm ảnh, khiến nó khả thi về mặt tính toán.
-
Mô hình chuyển \(f_\\theta\) và mô hình phần thưởng \(g_\\theta\) được huấn luyện trên trải nghiệm thực, và chính sách được huấn luyện trên các triển khai tưởng tượng. Điều này tách biệt việc thu thập dữ liệu khỏi tối ưu hóa chính sách.
-
Với thao tác robot, các mô hình thế giới cho phép tập dượt trong đầu (mental rehearsal). Trước khi thử cầm nắm, robot có thể mô phỏng một vài cách tiếp cận trong mô hình học được và chọn cách có khả năng thành công cao nhất. Điều này đặc biệt giá trị cho các tác vụ giàu tiếp xúc, nơi thử và sai trong thực tế chậm và rủi ro.
-
Các mô hình thế giới cũng kết nối tự nhiên với sim-to-real: một mô hình thế giới huấn luyện trên dữ liệu thực về cơ bản là một trình mô phỏng học được, tự động nắm bắt vật lý thế giới thực, loại bỏ hoàn toàn khoảng cách sim-to-real. Mô hình có thể kém chính xác hơn một trình mô phỏng tự xây đối với các tình huống hiểu rõ, nhưng nó nắm bắt được các hiệu ứng (ma sát, biến dạng, động lực học tiếp xúc) mà các trình mô phỏng tự xây thường tính sai.
-
JEPA (Joint Embedding Predictive Architecture — Kiến trúc dự đoán gép nối embedding, giới thiệu ở chương 10) cung cấp một lựa chọn thay thế cho dự đoán cấp điểm ảnh. Thay vì dự đoán các quan sát tương lai chính xác, JEPA dự đoán trong không gian embedding: "biểu diễn tiềm ẩn của trạng thái tiếp theo sẽ gần với vector này". Điều này tránh được khó khăn của việc dự đoán các tương lai hoàn hảo về điểm ảnh (vừa không cần thiết vừa lãng phí tính toán) và tập trung vào dự đoán những khía cạnh của tương lai quan trọng cho việc ra quyết định.
-
Hạn chế của các mô hình thế giới là lỗi dự đoán cộng dồn. Những sai số nhỏ trong mô hình chuyển tích lũy qua các triển khai dài, khiến các quỹ đạo tưởng tượng chệch khỏi thực tế. Các biện pháp giảm thiểu gồm chân trời tưởng tượng ngắn, các mô hình tập hợp (dùng độ bất định để phát hiện khi dự đoán trở nên không đáng tin), và định kỳ neo mô hình lại bằng dữ liệu thực tươi.
Thao tác¶
-
Thao tác (manipulation) là nghệ thuật dùng cơ cấu cuối của robot để tương tác với vật thể: cầm, đặt, đẩy, lắp, lắp ráp.
-
Cầm nắm (grasping) là kỹ năng thao tác nền tảng. Mục tiêu là tìm một tư thế cầm nắm ổn định: một vị trí và hướng cho cơ cấu kẹp sẽ giữ chắc vật thể.
-
Lập kế hoạch cầm nắm phân tích dùng vật lý. Một cái cầm là ổn định nếu các lực tiếp xúc có thể chống lại các mô-men ngoại lực (lực và mô-men). Với một cơ cấu kẹp hàm song song, tiêu chí đơn giản nhất là điều kiện đóng lực (force closure): các pháp tuyến tiếp xúc phải bao trùm mọi hướng lực, để cái cầm có thể chống lại bất kỳ nhiễu loạn nào. Việc này liên quan đến việc kiểm tra hạng của ma trận mô-men cầm nắm, một ứng dụng trực tiếp của khái niệm hạng từ chương 2.
-
Cầm nắm dựa trên dữ liệu học cách dự đoán thành công cầm nắm từ đầu vào cảm biến. Cho một ảnh độ sâu của các vật trên bàn, một mạng dự đoán điểm chất lượng cầm nắm cho mỗi tư thế cơ cấu kẹp ứng viên. GraspNet và các kiến trúc tương tự dùng các bộ mã hóa đám mây điểm (kiểu PointNet, chương 8) để dự đoán các tư thế cầm nắm 6-DoF (vị trí + hướng) kèm theo các điểm tin cậy.
-
Thao tác khéo léo (dexterous manipulation) vượt xa cầm-đặt đơn giản. Một bàn tay nhiều ngón có 20+ DoF và có thể thực hiện các tác vụ như xoay trong lòng bàn tay (xoay một cây bút giữa các ngón), dùng công cụ, và lắp ráp tinh xảo. Không gian trạng thái là khổng lồ và các tiếp xúc phức tạp, khiến đây trở thành một trong những bài toán khó nhất của robot học.
-
Học thao tác khéo léo thường dùng học tăng cường (chương 6) trong mô phỏng với làm ngẫu nhiên miền mạnh. Công trình của OpenAI về giải Rubik's cube bằng bàn tay Shadow đã huấn luyện các chính sách PPO trong mô phỏng với vật lý đã làm ngẫu nhiên, đạt được chuyển giao sang một bàn tay robot thật.
-
Các tác vụ giàu tiếp xúc như lắp chốt vào lỗ hoặc lau một bề mặt đòi hỏi robot duy trì tiếp xúc có kiểm soát với môi trường. Những tác vụ này đòi hỏi cảm biến lực và điều khiển tuân theo (impedance control), và khó mô phỏng chính xác vì vật lý tiếp xúc nổi tiếng là khó mô hình hóa.
Di chuyển¶
-
Di chuyển là làm cho thân robot chuyển động qua thế giới: đi, chạy, leo trèo, bơi. Khác biệt then chốt so với thao tác là robot phải duy trì thăng bằng trong khi di chuyển, và các điểm tiếp xúc với mặt đất thay đổi theo thời gian.
-
Di chuyển bằng chân (legged locomotion) là thách thức vì bản chất không ổn định. Một robot hai chân (như người) đứng trên một chân trong lúc bước đi giống như một con lắc đảo ngược. Trọng tâm phải nằm trên đa giác hỗ trợ (bao lồi của các bàn chân tiếp xúc với mặt đất), nếu không robot sẽ ngã.
-
Điểm mô-men không (ZMP) là điểm trên mặt đất nơi tổng mô-men từ trọng lực và lực quán tính bằng không. Nếu ZMP nằm trong đa giác hỗ trợ, robot sẽ không bị ngã. Các bộ điều khiển người máy hai chân truyền thống (như ASIMO của Honda) lập kế hoạch các quỹ đạo giữ ZMP trong giới hạn.
-
Bộ sinh mẫu hình trung tâm (CPG) là các bộ điều khiển dựa trên dao động lấy cảm hứng từ sinh học. Động vật sinh ra các mẫu chuyển động nhịp điệu (đi, phi nước kiệu, phi nước đại) dùng các mạch thần kinh trong tủy sống, không cần sự tham gia liên tục của não. Các mô hình CPG dùng các phương trình vi phân ghép cặp:
-
với \(\\phi_i\) là pha của dao động \(i\), \(\\omega_i\) là tần số tự nhiên, \(w_{ij}\) là cường độ ghép, và \(\\psi_{ij}\) là độ lệch pha mong muốn. Các mối quan hệ pha khác nhau sinh ra các dáng đi khác nhau: tất cả các chân đồng bộ (bound), các cặp xen kẽ (trot), tuần tự (walk). Sự ghép sin tự nhiên đồng bộ các dao động, tương tự như cách chuỗi Fourier (chương 3) phân rã chuyển động thành các thành phần tần số.
-
Học tăng cường cho di chuyển đã trở thành cách tiếp cận chủ đạo cho các robot bốn chân và hai chân nhanh nhẹn. Robot học một chính sách \(\\pi(\\mathbf{a} \\mid \\mathbf{o})\) qua thử và sai trong mô phỏng (chương 6), với phần thưởng cho vận tốc tiến, độ ổn định và hiệu quả năng lượng, và phạt cho ngã, vi phạm giới hạn khớp, và chuyển động giật cục.
-
Ý kiến then chốt từ các công trình gần đây (ví dụ của Agility Robotics, Boston Dynamics, và các lab học thuật) là các chính sách di chuyển huấn luyện bằng RL bền vững hơn nhiều so với các bộ điều khiển tự thiết kế. Chúng tự nhiên học được cách phục hồi sau các cú đẩy, thích nghi với thay đổi địa hình, và xử lý các tình huống mà không kỹ sư nào lường trước. Việc huấn luyện thường dùng PPO (chương 6) với làm ngẫu nhiên miền.
-
Robot bốn chân (như Spot của Boston Dynamics hay Go2 của Unitree) đã trở thành con ngựa thồ của robot học chân. Bốn chân mang lại sự ổn định tự thân (ba chân tạo thành một cái kiềng ba chân luôn có thể đỡ thân khi một chân di chuyển). Các chính sách RL cho robot bốn chân đạt kết quả ấn tượng: chạy 3+ m/s, leo cầu thang, đi qua địa hình đá, và phục hồi sau các cú đá.
-
Di chuyển người máy hai chân khó hơn vì hai chân có đa giác hỗ trợ nhỏ hơn và trọng tâm cao hơn. Các tiến bộ gần đây (Tesla Optimus, Figure, Unitree H1) dùng RL huấn luyện trong mô phỏng với tạo hình phần thưởng cẩn thận. Robot người máy phải học không chỉ đi mà còn phối hợp đánh tay để giữ thăng bằng, đi qua các bề mặt gồ ghề, và phục hồi sau các nhiễu loạn.
An toàn trong học robot¶
-
Một con robot khám phá ngẫu nhiên để học (như trong RL) có thể tự làm hỏng mình, môi trường xung quanh, hoặc con người gần đó. Học robot an toàn ràng buộc sự khám phá để tránh các hậu quả thảm khốc.
-
RL có ràng buộc thêm các ràng buộc an toàn vào MDP (chương 6). Mục tiêu trở thành: tối đa hóa phần thưởng với điều kiện \(J_c(\\pi) \\leq d\), với \(J_c\) là chi phí tích lũy kỳ vọng (ví dụ các sự kiện va chạm) và \(d\) là chi phí cho phép tối đa. Các thuật toán như Constrained Policy Optimisation (CPO) mở rộng PPO để xử lý các ràng buộc này.
-
Phong bì an toàn (safety envelopes) định nghĩa các ranh giới cứng mà robot không bao giờ được vượt qua, bất kể chính sách học được nói gì. Một bộ điều khiển an toàn giám sát trạng thái robot và ghi đè chính sách học được khi một ràng buộc sắp bị vi phạm (ví dụ tiệm cận giới hạn khớp, di chuyển quá nhanh gần người, hoặc vượt ngưỡng lực). Đây là một kiến trúc phân lớp: thuật toán học lo phần hiệu năng, và lớp an toàn lo phần ràng buộc.
-
Lập kế hoạch biết rủi ro mô hình hóa tường minh sự bất định trong môi trường và ước lượng trạng thái của chính robot. Thay vì lập kế hoạch cho kết quả có khả năng nhất, nó lập kế hoạch cho trường hợp xấu nhất trong một giới hạn tin cậy. Điều này kết nối với khái niệm số điều kiện (condition number, chương 2): một hệ được điều kiện tốt thì bền vững trước nhiễu loạn, và lập kế hoạch biết rủi ro tìm kiếm các chiến lược điều khiển vẫn an toàn dưới nhiễu loạn.
Bài tập lập trình (dùng CoLab hoặc notebook)¶
-
Triển khai động học thuận cho một cánh tay robot phẳng 2 khớp đơn giản. Tính và trực quan hóa vị trí cơ cấu cuối cho các góc khớp khác nhau.
import jax.numpy as jnp import matplotlib.pyplot as plt def forward_kinematics(q1, q2, l1=1.0, l2=0.8): """Compute joint and end-effector positions for a 2-link arm.""" x1 = l1 * jnp.cos(q1) y1 = l1 * jnp.sin(q1) x2 = x1 + l2 * jnp.cos(q1 + q2) y2 = y1 + l2 * jnp.sin(q1 + q2) return jnp.array([0, x1, x2]), jnp.array([0, y1, y2]) fig, ax = plt.subplots(figsize=(6, 6)) configs = [(0.5, 0.3), (1.0, -0.5), (1.5, 1.0), (2.0, -1.5)] colors = ["#e74c3c", "#3498db", "#27ae60", "#9b59b6"] for (q1, q2), c in zip(configs, colors): xs, ys = forward_kinematics(q1, q2) ax.plot(xs, ys, "o-", color=c, linewidth=2, markersize=6, label=f"q=({q1:.1f}, {q2:.1f})") ax.set_xlim(-2, 2); ax.set_ylim(-2, 2) ax.set_aspect("equal"); ax.grid(True); ax.legend() ax.set_title("2-Link Robot Arm: Forward Kinematics") plt.show() -
Triển khai động học nghịch dùng ma trận Jacobi giả nghịch đảo. Bắt đầu từ một cấu hình ngẫu nhiên và lặp di chuyển cơ cấu cuối về một mục tiêu.
import jax import jax.numpy as jnp import matplotlib.pyplot as plt l1, l2 = 1.0, 0.8 def end_effector(q): x = l1 * jnp.cos(q[0]) + l2 * jnp.cos(q[0] + q[1]) y = l1 * jnp.sin(q[0]) + l2 * jnp.sin(q[0] + q[1]) return jnp.array([x, y]) jacobian_fn = jax.jacobian(end_effector) target = jnp.array([0.5, 1.2]) q = jnp.array([0.1, 0.1]) trajectory = [end_effector(q)] for _ in range(50): pos = end_effector(q) error = target - pos if jnp.linalg.norm(error) < 1e-4: break J = jacobian_fn(q) # Damped pseudo-inverse to handle near-singularities dq = J.T @ jnp.linalg.solve(J @ J.T + 0.01 * jnp.eye(2), error) q = q + dq trajectory.append(end_effector(q)) traj = jnp.stack(trajectory) plt.plot(traj[:, 0], traj[:, 1], "b.-", label="end-effector path") plt.plot(*target, "r*", markersize=15, label="target") plt.gca().set_aspect("equal"); plt.grid(True); plt.legend() plt.title(f"IK converged in {len(trajectory)-1} steps") plt.show() -
Mô phỏng một bộ điều khiển PID đơn giản bám theo một quỹ đạo khớp mong muốn. Quan sát hiệu ứng của việc tinh chỉnh các hệ số.
import jax.numpy as jnp import matplotlib.pyplot as plt # Desired trajectory: smooth sinusoidal motion dt = 0.01 t = jnp.arange(0, 5, dt) q_desired = jnp.sin(2 * t) # Simulate second-order dynamics: m * q_ddot + b * q_dot = tau m, b_damp = 1.0, 0.5 for Kp, Kd, Ki, label in [(10, 5, 0, "PD only"), (10, 5, 2, "PID"), (50, 10, 2, "Aggressive PID")]: q, q_dot, integral = 0.0, 0.0, 0.0 qs = [] for i in range(len(t)): error = q_desired[i] - q integral += error * dt d_error = -q_dot # derivative of error (desired velocity is known but simplified here) tau = Kp * error + Kd * d_error + Ki * integral q_ddot = (tau - b_damp * q_dot) / m q_dot += q_ddot * dt q += q_dot * dt qs.append(float(q)) plt.plot(t, qs, label=label) plt.plot(t, q_desired, "k--", label="desired", linewidth=2) plt.xlabel("Time (s)"); plt.ylabel("Joint angle") plt.legend(); plt.title("PID Controller Tracking") plt.show()