Với robot 6 trục, được đặt ở vị trí đầu cuối và phạm vi định hướng, cách tìm giá trị khớp tối ưu


10

Với một cánh tay robot có khớp nối sáu trục đang giữ một công cụ ở đầu cuối của nó, nếu tôi có một vị trí công cụ và hướng công cụ mong muốn, sẽ có chính xác 1 giải pháp cho phương trình động học nghịch đảo để robot đạt đến vị trí đó.
(hay đúng hơn là tối đa 16 giải pháp khác nhau, tùy thuộc vào phạm vi của các khớp)

http://en.wikipedia.org/wiki/Robotic_arm

Nhưng nếu robot đang cầm thứ gì đó giống như cây bút và tôi muốn robot đánh dấu một điểm cụ thể bằng cây bút đó vào mục tiêu, thì tôi không quan tâm đến việc cây bút được định hướng như thế nào, miễn là nó vuông góc với bề mặt được đánh dấu.

Vì vậy phương trình nghịch đảo sẽ có vô số nghiệm.

Làm cách nào tôi có thể chọn trong số các giải pháp này cấu hình chung gần nhất với cấu hình hiện tại: giải pháp nào sẽ cần ít chuyển động nhất để tiếp cận?
(hoặc cấu hình khớp tối ưu theo một số tiêu chí tương tự khác, chẳng hạn như tất cả các góc khớp đều xa nhất từ ​​mức tối đa và tối thiểu của chúng?)

Câu trả lời:


9

Đầ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=xTQxQ

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=[100x010y001z0001](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:

[100001000010]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=12xTQx+cTx

AxbEx=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.


2

Vì câu hỏi là về một robot công nghiệp, có lẽ chúng ta không có mô hình động lực học của robot, vì vậy tôi cho rằng chúng ta đang tìm kiếm các giải pháp chỉ tối ưu hóa một tiêu chí động học.

Robot có một giải pháp dạng đóng cho động học nghịch đảo của nó, nhưng thật không may là bộ phận đầu cuối có một mức độ tự do quay thêm, điều đó có nghĩa là robot có 7 bậc tự do. Nhưng bởi vì đây chỉ là một dof nữa , nó không phải là một vấn đề như người ta có thể nghĩ.

0.051360118

Nếu hầu hết thời gian bút chỉ di chuyển một chút (ví dụ như khi vẽ một đường kẻ), một mẹo khác để tăng tốc độ tìm kiếm là sử dụng IK số, ví dụ như phương pháp giả:

q1JΔxΔx=JΔqΔqq2=q1+ΔqΔqΔq

Điều này được thực hiện cho robot 7 dof và một lần nữa sẽ chỉ mất một phần của một phần nghìn giây. Mặc dùq2


1

rz

J1X˙=Θ˙=[j1j2j3j4j5j6][x˙y˙z˙rx˙ry˙rz˙]=[θ1˙θ2˙θ3˙θ4˙θ5˙θ6˙]
jiithJ1Θ˙rz˙
Θ˙=Θ˙x˙ry˙+Θ˙rz˙Θ˙rz˙=j6rz˙
(Θ˙x˙ry˙+Θ˙rz˙)TD(Θ˙x˙ry˙+Θ˙rz˙)
DA=Θ˙x˙ry˙B=Θ˙rz˙

ATDA+2BTDA+BTDBorATDA+2rz˙j6TDA+rz˙2j6TDj6

rz˙rz˙0

2j6TDA+2rz˙j6TDj6=0rz˙=j6TDAj6TDj6
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.