Mục lục:

Hiểu cách trộn kênh: 4 bước (có hình ảnh)
Hiểu cách trộn kênh: 4 bước (có hình ảnh)

Video: Hiểu cách trộn kênh: 4 bước (có hình ảnh)

Video: Hiểu cách trộn kênh: 4 bước (có hình ảnh)
Video: Cách Viết Kịch Bản Cho Video Của Bạn | Hướng Dẫn Cụ Thể 2024, Tháng bảy
Anonim
Image
Image
Phương pháp kết hợp »Không có
Phương pháp kết hợp »Không có

Nếu bạn đã từng lái khung điều khiển từ xa, rất có thể bạn đã sử dụng cách trộn, ngay cả khi bạn không biết điều đó. Cụ thể, nếu bạn đã sử dụng một cần điều khiển hoặc cần điều khiển để điều khiển một chiếc xe sử dụng hệ thống lái trượt hoặc lái vi sai, thì bạn đã sử dụng kết hợp.

Kết hợp chỉ đơn giản là cách dữ liệu từ cần điều khiển của bạn được sử dụng để xác định lượng điện năng nên được cung cấp cho mỗi bên của khung máy.

Nếu bạn mở cần điều khiển, nhìn chung bạn sẽ thấy hai chiết áp bên trong. Một để đo vị trí hiện tại của bạn dọc theo trục Y (lên và xuống) và một để đo vị trí của bạn dọc theo trục X (từ bên này sang bên kia).

Mặc dù tôi không được đào tạo chính thức về chủ đề này, tôi đã phải làm công việc trộn mã trước đây và gần đây tôi muốn tìm hiểu sâu hơn một chút về chủ đề này.

Đầu tiên, tôi muốn lưu ý rằng hầu hết các máy phát RC đều có khả năng trộn giống như nhiều bộ điều khiển động cơ. Thông tin này sẽ hữu ích nhất nếu bạn phải tự trộn mã trong mã của mình. Ví dụ: giả sử bạn đang sử dụng Arduino để đọc dữ liệu không trộn lẫn từ bộ thu RC hoặc bạn đang đọc dữ liệu tương tự từ các bình trong một cần điều khiển hoặc nếu bạn đang đọc tọa độ từ một cần điều khiển kỹ thuật số trên ứng dụng dành cho thiết bị di động.

Chúng ta hãy xem xét một số cách tiếp cận trộn khác nhau.

Bước 1: Phương pháp kết hợp »Không có

Trước tiên, hãy xem điều gì sẽ xảy ra nếu bạn không sử dụng cách trộn. Nếu bạn chỉ gửi dữ liệu từ một trục đến một bên của khung xe và trục kia sang phía bên kia, xe của bạn sẽ không phản hồi theo cách bạn muốn.

Ví dụ: nếu bạn đẩy hết cần điều khiển về phía trước, trục Y ở mức hết ga và trục X ở mức 0. Vì vậy, bạn sẽ lái xe theo vòng tròn thay vì đi thẳng.

Bước 2: Phương pháp Phương pháp »Xoay

Phương pháp Phương pháp »Xoay
Phương pháp Phương pháp »Xoay

Một đồng nghiệp đã từng chỉ ra với tôi rằng, bạn có thể xoay máy phát của mình 45 độ để phù hợp với một người đàn ông nghèo. Nếu bạn nghĩ các giá trị từ hai chiết áp trong một cần điều khiển là trục x một y trên lưới (với cả hai trục kéo dài từ -100 đến +100), điều này rất có ý nghĩa vì bạn sẽ +100 trên cả hai trục khi bạn đẩy cần điều khiển lên và sang phải. Vì vậy, nếu điều này ánh xạ trực tiếp đến hai kênh khung gầm của bạn (bên trái và bên phải của rô bốt), nó sẽ làm cho rô bốt của bạn tiến về phía trước.

Vì vậy, phương pháp trộn đầu tiên mà tôi từng thử là xoay tọa độ x và y một cách toán học 45 độ về điểm trung tâm của lưới.

Điều này hoạt động tốt, tuy nhiên tôi không thể tiếp tục với 100% sức mạnh vì khi bạn đang xoay, chuyển động tổng thể bị giới hạn trong một vòng tròn trong lưới, có nghĩa là bạn không bao giờ thực sự có thể vào được góc trên cùng bên phải.

Điều này cũng dẫn đến các góc của lưới không được sử dụng. Đây không phải là vấn đề nếu bạn đang sử dụng cần điều khiển / gimple giới hạn chuyển động của bạn để những khu vực đó không bao giờ đạt được, nhưng nếu không, bạn sẽ muốn phần đó của lưới làm điều gì đó để các chuyển động của bạn cảm thấy hoàn toàn tương xứng.

Nếu bạn là một người học trực quan như tôi, khái niệm này có thể dễ dàng tìm hiểu hơn bằng cách xem video ở đầu phần hướng dẫn này.

Hãy xem xét một số ví dụ mã.

LƯU Ý VỀ CÁC VÍ DỤ MÃ CỦA TÔI: Tôi đang bỏ qua cách bạn lấy các giá trị cần điều khiển_x và cần điều khiển_y vì nó sẽ thay đổi tùy thuộc vào dự án của bạn. Ngoài ra, tôi sẽ ánh xạ / giới hạn đến ± 100 nhưng bạn có thể cần ánh xạ đến 1000 - 2000 cho PWM hoặc 0 - 255 cho đầu ra tương tự, v.v. Tôi luôn hạn chế… đề phòng.

Ví dụ về Arduino:

// xoay theo toán học

đôi rad = -45 * M_PI / 180; int leftThrottle = cần điều khiển_x * cos (rad) - cần điều khiển_y * sin (rad); int rightThrottle = cần điều khiển_y * cos (rad) + cần điều khiển_x * sin (rad); // ràng buộc leftThrottle = constraintin (leftThrottle, -100, 100); rightThrottle = ràng buộc (rightThrottle, -100, 100);

Ví dụ JavaScript:

// về mặt toán học xoayvar rad = -45 * Math. PI / 180; leftThrottle = phím điều khiển_x * Math.cos (rad) - phím điều khiển_y * Math.sin (rad); rightThrottle = cần điều khiển_y * Math.cos (rad) + cần điều khiển_x * Math.sin (rad); // bindinleftThrottle = constraintin (leftThrottle, -100, 100); rightThrottle = constraintin (rightThrottle, -100, 100); // helper functionvar constraintin = function (num, min, max) {return Math.min (Math.max (num, min), max); };

Bước 3: Phương pháp Phương pháp »Đơn giản

Phương pháp Phương pháp »Đơn giản
Phương pháp Phương pháp »Đơn giản

Tiếp theo, chúng ta có một phương trình rất đơn giản mà tôi chọn lần đầu tiên từ một trong những video của Shawn Hymel’s Adventures in Science SparkFun, nơi anh ấy tình cờ thực hiện một dự án rất giống với dự án mà tôi đang làm.

Phương trình này cho phép bạn đạt được tốc độ tối đa khi đi về phía trước nhưng giống như phương pháp xoay, nó không tính đến các khu vực góc của lưới. Điều này là do trong một số trường hợp, giá trị tối đa là 100 và trong một số trường hợp, giá trị tối đa là 200. Vì vậy, bạn sẽ sử dụng một hàm ràng buộc để bỏ qua bất kỳ thứ gì sau 100.

Và nhân tiện, tôi không gọi điều này là đơn giản… đơn giản có một vẻ đẹp.

Ví dụ về Arduino:

int leftThrottle = cần điều khiển_y + cần điều khiển_x;

int rightThrottle = cần điều khiển_y - cần điều khiển_x; // ràng buộc leftThrottle = constraintin (leftThrottle, -100, 100); rightThrottle = bindin (rightThrottle, -100, 100);

Ví dụ JavaScript:

var leftChannel = cần điều khiển_y + phím điều khiển_x;

var rightChannel = joystick_y - cần điều khiển_x; // ràng buộc leftChannel = constraintin (leftChannel, -100, 100); rightChannel = constraintin (rightChannel, -100, 100); // helper functionvar constraintin = function (num, min, max) {return Math.min (Math.max (num, min), max); };

Bước 4: Phương pháp Phương pháp »Tỷ lệ

Phương pháp Phương pháp »Tỷ lệ
Phương pháp Phương pháp »Tỷ lệ

Tôi bắt đầu từ phương pháp đơn giản với hy vọng tạo ra một phương trình tốt nhất của cả hai thế giới. Ý tưởng ở đây là hoàn toàn tỷ lệ thuận theo tất cả các hướng thậm chí theo đường chéo mặc dù thực tế là mặc dù bạn đang di chuyển một khoảng cách lớn hơn, nó có cùng phạm vi như khi bạn di chuyển theo phương thẳng đứng, tức là một khoảng cách nhỏ hơn.

Bạn kết thúc với tỷ lệ -200 đến +200 ở mọi hướng trong ví dụ của tôi, tôi ánh xạ tỷ lệ đó là ± 100 vì nó thể hiện phần trăm công suất đi đến mỗi kênh - tuy nhiên bạn sẽ muốn ánh xạ nó với bất kỳ thứ gì hoạt động trong mục đích sử dụng của bạn- trường hợp cho bộ điều khiển động cơ của bạn. Ví dụ: nếu bạn đang gửi một tín hiệu PWM, bạn có thể ánh xạ nó thành 1000 đến 2000 hoặc nếu bạn đang gửi một tín hiệu tương tự, bạn có thể ánh xạ nó thành 0-255 và đặt hướng là boolean, v.v.

Ví dụ về Arduino:

int leftThrottle = cần điều khiển_y + cần điều khiển_x;

int rightThrottle = Joystick_y - Joystick_x; // trong một số trường hợp, giá trị tối đa là 100, trong một số trường hợp là 200 // hãy tính theo sự khác biệt để giá trị tối đa luôn là 200int diff = abs (abs (phím điều khiển_y) - abs (phím điều khiển_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - diff: rightThrottle + diff; // Bản đồ từ ± 200 đến ± 100 hoặc bất kỳ phạm vi nào bạn kimftThrottle = map (leftThrottle, 0, 200, -100, 100); rightThrottle = map (rightThrottle, 0, 200, -100, 100); // constraintinleftThrottle = bindin (leftThrottle, -100, 100); rightThrottle = bindin (rightThrottle, -100, 100);

Ví dụ về JavaScript:

var leftThrottle = Joystick_y + Joystick_x; var rightThrottle = Joystick_y - Joystick_x; // trong một số trường hợp, giá trị tối đa là 100, trong một số trường hợp là 200, // hãy tính theo sự khác biệt để giá trị tối đa luôn là 200var diff = Math.abs (Math.abs (cần điều khiển_y) - Math.abs (cần điều khiển_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - diff: rightThrottle + diff; // Bản đồ từ ± 200 trở xuống ± 100 hoặc bất cứ thứ gì bạn kimftThrottle = map (leftThrottle, -200, 200, -100, 100); rightThrottle = map (rightThrottle, -200, 200, -100, 100); // ràng buộc leftThrottle = bindin (leftThrottle, -100, 100); rightThrottle = bindin (rightThrottle, -100, 100); // một số hàm trợ giúpvar bindin = function (num, min, max) {return Math.min (Toán học. max (num, min), max); }; var map = function (num, inMin, inMax, outMin, outMax) {var p, inSpan, outSpan, ánh xạ; inMin = inMin + inMax; num = num + inMax; inMax = inMax + inMax; inSpan = Math.abs (inMax-inMin); p = (num / inSpan) * 100; outMin = outMin + outMax; outMax = outMax + outMax; outSpan = Math.abs (outMax - outMin); ánh xạ = outSpan * (p / 100) - (outMax / 2); trả về ánh xạ;};

Đề xuất: