Đầu tiên, chúng ta cần xác định tối ưu . Vì bạn không nói những gì bạn cho là tối ưu, hầu hết mọi người chọn biểu thức bậc hai. Ví dụ: giả sử các góc khớp hiện tại của bạn được cho bởi vectơ . Chúng tôi có thể xem xét giảm thiểu sự chuyển động cần thiết - với một lỗi → x = → alpha - → alpha s t một r t , bạn có thể định nghĩa một hàm chi phí J = → x T Q → x đối với một số ma trận Q . Chúng ta thường sử dụng một ma trận đường chéo, nhưng bất kỳ ma trận xác định dương nào cũng sẽ làm được.α⃗ x⃗ =α⃗ −α⃗ startJ=x⃗ TQx⃗ Q
Trong một ví dụ đơn giản với hai góc khớp, nếu khớp có động cơ rẻ hơn (có lẽ gần với đầu cuối hơn), chúng ta có thể có hàm chi phí làa
, tức là. chuyển động của khớp b tốn kém gấp đôi so với khớp a .J=[xaxb][1002][xaxb]ba
Bây giờ, phương trình động học là một công thức ma trận và trong ký hiệu Denavit-Hartenberg có thể là:
∏Ti=⎡⎣⎢⎢⎢100001000010xyz1⎤⎦⎥⎥⎥(x,y,z)
Vì chúng tôi không quan tâm đến định hướng và chỉ vị trí, chúng tôi có thể cắt 3 cột đầu tiên của ma trận biến đổi cuối cùng và hàng cuối cùng của ma trận biến đổi đầu tiên. Chúng ta có thể biểu diễn công thức này như sau:
⎡⎣⎢100010001000⎤⎦⎥∏Ti⎡⎣⎢⎢⎢0001⎤⎦⎥⎥⎥=⎡⎣⎢xyz⎤⎦⎥
Nhân ra bên trái, chúng ta có ba phương trình. Nếu các tham số là tuyến tính, nó sẽ đơn giản để giải quyết. Đây là trường hợp nếu tất cả các bộ truyền động là bộ truyền động tuyến tính. Trong trường hợp này, vấn đề thực sự là một chương trình bậc hai . Chúng ta có thể sắp xếp lại phía bên trái để có được phương trình:
Kx⃗ =⎡⎣⎢xyz⎤⎦⎥K
Một chương trình bậc hai là một vấn đề có thể được thể hiện dưới dạng:
J=12x⃗ TQx⃗ +c⃗ Tx⃗
Ax⃗ ≤b⃗ Ex⃗ =d⃗
Để giải quyết vấn đề này, có một số thuật toán bạn có thể sử dụng, ví dụ: điểm bên trong, bộ hoạt động, .... Chỉ cần tìm một thư viện phù hợp, và nó sẽ giải quyết nó cho bạn.
Một hệ phương trình phi tuyến tính khó giải hơn. Đây được gọi là lập trình phi tuyến tính , nhưng nó là những gì bạn có nếu bạn có khớp xoay.
Về cơ bản, thay cho các phương trình ma trận, bạn có các hàm phi tuyến.
f(x)h⃗ (x)=0g⃗ (x)≤0
Các thuật toán được sử dụng để giải quyết vấn đề này thậm chí còn phức tạp hơn, nhưng bao gồm các thuật toán nội suy bậc hai, tuần tự (SQP), Active-set, thuật toán phản xạ vùng tin cậy. Rõ ràng, lời giải thích về cách thức các thuật toán này hoạt động rất dài và tôi sẽ để nó ra khỏi phạm vi của câu trả lời này. Có thể nói, số lượng nội dung trên các thuật toán được sử dụng cho lập trình bậc hai có thể là toàn bộ khóa học.
Bạn chỉ nên tìm một thư viện để giải quyết vấn đề, sẽ mất nhiều thời gian để mã hóa một triển khai hiệu quả và việc triển khai hiệu quả có thể xử lý 100 (hoặc nhiều) biến tại một thời điểm. Ví dụ: nếu bạn sử dụng MATLAB, thì có tài liệu về cách sử dụng hàm fmincon từ Hộp công cụ tối ưu hóa.
Để giải quyết nó trực tuyến, bạn có thể muốn C ++ hoặc triển khai riêng khác, ví dụ: NLopt. Xin lưu ý rằng đây có thể không phải là thứ mà vi điều khiển có thể giải quyết nhanh chóng và nhiều thư viện có thể có các phụ thuộc khác không dễ sử dụng trên vi điều khiển (vì chúng được dành cho máy tính).
Nếu bạn không lo lắng về hiệu quả và chỉ muốn một cái gì đó bạn có thể tự viết mã, thì giả sử có một hàm bạn có thể gọi để giải quyết vấn đề động học nghịch đảo , bạn chỉ cần thực hiện phương pháp giảm độ dốc. Ví dụ, tùy ý chọn một hướng bắt đầu ngẫu nhiên, giải quyết vấn đề nghịch đảo, sau đó kiểm tra hàm chi phí. Sau đó, bạn có thể sử dụng phân tích nhiễu loạn để kiểm tra xem bạn nên thay đổi hướng như thế nào. Ví dụ: nếu bạn kiểm tra các hướng tương tự xung quanh hướng hiện tại của mình (ví dụ: 8 điểm trong lưới hình khối), bạn có thể nhận được xấp xỉ bậc hai về cách hàm chi phí thay đổi theo từng hướng.
Sử dụng xấp xỉ bậc hai (được gọi là ma trận Hessian vì nó là đa biến - 3 chiều cho định hướng), bạn có thể tìm thấy độ giao nhau của độ dốc của hàm chi phí (nghĩa là cực tiểu cục bộ dự đoán).
Với định hướng dự đoán mới, chỉ cần đặt nó qua bộ giải ngược lại và lặp lại cho đến khi độ chính xác là đủ.
Xin lưu ý rằng điều này có thể sẽ không hiệu quả, bởi vì chính vấn đề động học ngược phải được giải quyết lặp lại (vì vậy bạn liên tục sử dụng một hàm mà phải mất một thời gian để giải quyết). Ngoài ra, mã liên quan có thể ít hơn một thuật toán tối ưu hóa hoàn toàn, nhưng nó vẫn còn khá lớn và không phải là một khoản đầu tư thời gian không đáng kể.
Sử dụng một trong hai phương pháp (chính thức giải quyết như một chương trình phi tuyến hoặc sử dụng hàm lặp để sử dụng hàm giải quyết vấn đề nghịch đảo), giải pháp có thể không tối ưu nếu có nhiều cực tiểu cục bộ. Trong trường hợp này, bạn có thể cố gắng tìm cực tiểu toàn cầu bằng cách sử dụng các phương pháp khác nhau. Ngay cả với một bộ giải lập trình phi tuyến tính, bạn sẽ được yêu cầu gieo nó với các giá trị ban đầu (ví dụ: các góc khớp). Bạn có thể liên tục chạy một trong hai phương thức với hạt giống được tạo theo nhiều cách khác nhau:
- khởi động lại ngẫu nhiên (nó được tạo ngẫu nhiên)
- dựa trên lưới
hoặc các phương pháp tùy chỉnh khác.
Tuy nhiên, lưu ý rằng nếu có nhiều cực tiểu, không có cách nào tốt để đảm bảo rằng bạn sẽ tìm thấy cực tiểu toàn cầu. Bạn chỉ có thể cải thiện cơ hội của bạn.