Tính toán vị trí của robot ổ đĩa vi sai


14

Làm thế nào để bạn tính toán hoặc cập nhật vị trí của một robot ổ đĩa vi sai với các cảm biến gia tăng?

Có một cảm biến gia tăng được gắn vào mỗi hai bánh xe vi sai. Cả hai cảm biến xác định khoảng cách resp. Δ r i g h t bánh xe của họ đã tung trong một thời gian biết Δ t .ΔleftΔrightΔt

Đầu tiên, giả sử trung tâm giữa hai bánh xe đánh dấu vị trí của robot. Trong trường hợp này, người ta có thể tính toán vị trí như sau:

x=xleft+xright2y=yleft+yright2

"Xuất phát" các phương trình theo giả định rằng cả hai bánh xe lăn theo một đường thẳng (điều này gần đúng với khoảng cách nhỏ) tôi nhận được:

ΔxΔt=12(ΔleftΔt+ΔrightΔt)cos(θ)ΔyΔt=12(ΔleftΔt+ΔrightΔt)sin(θ)

Nơi là góc định hướng của robot. Đối với sự thay đổi của góc này, tôi tìm thấy phương trìnhθ

ΔθΔt=1w(ΔleftΔtΔrightΔt)

Trong đó là khoảng cách giữa hai bánh xe.w

Bởi vì Δ y phụ thuộc vào θ , tôi tự hỏi liệu tôi đầu tiên phải tính toán mới θ bằng cách thêm Δ θ hoặc nếu tôi thay vì phải sử dụng "cũ" θ ? Có bất kỳ lý do để sử dụng cái này hơn cái kia không?ΔxΔyθθΔθθ

xy

x=xleft+xright2+lcos(θ)y=yleft+yright2+lsin(θ)

"Xuất phát" đầu tiên cho:

ΔxΔt=12(ΔleftΔt+ΔrightΔt)cos(θ)lsin(θ)ΔθΔt

Δθθ

Có phương pháp nào tốt hơn để thực hiện cập nhật tương tự vị trí và định hướng không? Có thể sử dụng số phức (cách tiếp cận tương tự như với bậc bốn trong 3D?) Hoặc tọa độ đồng nhất?

Câu trả lời:


8

Để trả lời câu hỏi đầu tiên của bạn: nếu bạn thực sự muốn tìm các phương trình động học thực sự cho ổ đĩa vi sai, tôi sẽ không bắt đầu xấp xỉ bằng cách giả sử rằng mỗi bánh xe đã di chuyển trên một đường thẳng. Thay vào đó, tìm bán kính quay, tính điểm trung tâm của vòng cung và sau đó tính điểm tiếp theo của robot. Bán kính quay sẽ là vô hạn nếu robot di chuyển thẳng, nhưng trong trường hợp thẳng thì toán học rất đơn giản.

Vì vậy, chỉ cần tưởng tượng rằng qua mỗi bước thời gian hoặc mỗi lần bạn tính toán sự thay đổi của các cảm biến gia tăng, robot sẽ di chuyển từ điểm A đến điểm B trên một cung như thế này: nhập mô tả hình ảnh ở đây Đây là một số mã mẫu với phép toán được đơn giản hóa:

// leftDelta and rightDelta = distance that the left and right wheel have moved along
//  the ground

if (fabs(leftDelta - rightDelta) < 1.0e-6) { // basically going straight
    new_x = x + leftDelta * cos(heading);
    new_y = y + rightDelta * sin(heading);
    new_heading = heading;
} else {
    float R = unitsAxisWidth * (leftDelta + rightDelta) / (2 * (rightDelta - leftDelta)),
          wd = (rightDelta - leftDelta) / unitsAxisWidth;

    new_x = x + R * sin(wd + heading) - R * sin(heading);
    new_y = y - R * cos(wd + heading) + R * cos(heading);
    new_heading = boundAngle(heading + wd);
}

Tôi đã sử dụng toán học tương tự trong một trình giả lập để thể hiện các cách lái khác nhau: http://www.cs.utexas.edu/~rjnevels/RobotSimulator4/demos/StanguDemo/


1
Các phương trình được sử dụng trong đoạn mã trên có nguồn gốc ở đây: rossum.sourceforge.net/ con / DiffSteer
kamek

Giải thích tuyệt vời! Liên kết giả lập bị hỏng
smirkingman

2

Đối với một phép tính lặp đi lặp lại, không quan trọng bạn có tìm thấy hay không Δθ trước hoặc sau khi bạn nộp đơn θ để Δx,Δyphép tính. Bạn sẽ luôn xen kẽ giữa một vị trí và tính toán định hướng.

Trong một ý nghĩa thực tế, nó có thể tốt hơn để tính toán Δθ sau khi bạn tính toán Δx,Δy, vì lần lặp đầu tiên của bạn thông qua vòng lặp yêu cầu giá trị ban đầu là θ.

Hãy nhớ rằng dù sao đây cũng là một phương pháp đo dễ bị lỗi - đó là một cặp số đo 1D cung cấp xấp xỉ 2D cho thế giới 3D. Ngay cả khi bạn có thể có được mộtΔt rất gần với 0, nó vẫn sẽ không giải thích cho sự trượt bánh xe và địa hình không bằng phẳng.


Tìm kiếm "động học về phía trước của phương tiện truyền động vi sai" sẽ cung cấp một loạt các bài viết với cách tiếp cận toán học hơn cho câu hỏi này.
Ian
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.