-
-
-
Tổng tiền thanh toán:
-
Thương hiệu: (Đang cập nhật ...) Loại: (Đang cập nhật ...)
Sau khi hoàn thành Bài 9 – Nạp chương trình ESP32 và Bài 10 – Hiệu chỉnh Drone, học viên đã biết cách lập trình ESP32, đọc MPU6050, xử lý Roll/Pitch/Yaw, PID và Motor Mixing.
Bài 11 chuyển sang một cấp độ cao hơn:
Lập trình để Drone tự động di chuyển từ điểm A đến điểm B dựa trên dữ liệu vị trí và hướng.
Sau bài học, học viên có thể:
Ở các bài trước:
Joystick
↓
ESP32
↓
ESP-NOW
↓
Drone
↓
PID
↓
Motor Mixing
↓
Motor
Người điều khiển trực tiếp quyết định Drone đi đâu.
Ở bài này:
Điểm A → Điểm B
Người điều khiển chỉ đưa ra mục tiêu.
Drone tự thực hiện:
Đo vị trí
↓
Tính hướng
↓
Tính khoảng cách
↓
Điều khiển
↓
Đo lại
↓
Hiệu chỉnh
↓
Đến B
Đây là nguyên lý của điều khiển vòng kín.
Giả sử Drone đang ở:
A = (xA, yA)
Điểm cần đến:
B = (xB, yB)
Mục tiêu:
B ●
↑
/
/
/
● A
Drone phải xác định:
Đây là phần quan trọng nhất của hệ thống.
Có thể sử dụng:
MPU6050 chủ yếu đo gia tốc và tốc độ góc, không phải cảm biến định vị tuyệt đối.
Nếu chỉ sử dụng MPU6050 để tích phân gia tốc trong thời gian dài, sai số vị trí sẽ tích lũy.
Trong bài thực hành đơn giản, sử dụng hệ tọa độ X-Y:
Y+
↑
│
│
│
└────────→ X+
Ví dụ:
Drone = (2,3)
Target = (8,7)
Tính:
dx = xTarget - xDrone
dy = yTarget - yDrone
Ví dụ:
dx = 8 - 2 = 6
dy = 7 - 3 = 4
Khoảng cách:
D = √(dx² + dy²)
Kết quả:
D = √(6² + 4²)
≈ 7,21
Nếu đơn vị tọa độ là mét, Drone cách mục tiêu khoảng 7,21 m.
Có thể sử dụng:
targetHeading = atan2(dy, dx);
Kết quả cho biết hướng từ vị trí hiện tại đến điểm B.
Sau đó so sánh:
Target Heading
↓
Current Heading
↓
Heading Error
Ví dụ:
Target = 90°
Current = 70°
Error = +20°
Drone cần điều chỉnh Yaw để hướng về mục tiêu.
Phải lưu ý trường hợp:
Target = 5°
Current = 355°
Không nên tính đơn giản:
5 - 355 = -350°
Vì thực tế Drone chỉ cần xoay khoảng:
+10°
Do đó cần chuẩn hóa sai số góc về khoảng:
-180° → +180°
Ví dụ:
error = targetHeading - currentHeading;
while (error > 180)
error -= 360;
while (error < -180)
error += 360;
Ví dụ:
Target X = 10 m
Current X = 7 m
Ta có:
Error X = 10 - 7
= 3 m
Tương tự:
Error Y = Target Y - Current Y
Từ sai số này, Navigation Controller tạo ra lệnh chuyển động.
Đây là phần quan trọng nhất của bài.
Navigation xác định:
Drone cần đi hướng nào?
PID xác định:
Motor cần thay đổi như thế nào để Drone đạt trạng thái đó?
Mô hình:
Target Position
↓
Position Error
↓
Navigation
↓
Desired Roll/Pitch/Yaw
↓
PID
↓
Motor Mixing
↓
Motor
↓
Drone
↓
Sensor
↓
Feedback
Ví dụ Drone cần di chuyển theo trục X.
Target X
↓
Current X
↓
Error X
↓
Position Controller
↓
Desired Pitch
↓
Pitch PID
↓
Motor Mixing
Tương tự với trục Y:
Error Y
↓
Position Controller
↓
Desired Roll
↓
Roll PID
↓
Motor Mixing
Như vậy Drone có thể biến sai số vị trí thành góc nghiêng cần thiết.
Drone còn phải kiểm soát trục Z.
Ví dụ:
Target Altitude = 2 m
Current Altitude = 1,6 m
Sai số:
Error Z = 0,4 m
Bộ điều khiển độ cao tạo lệnh Throttle.
Có thể hình dung:
X → Pitch
Y → Roll
Z → Throttle
Yaw → Heading
Quy trình cơ bản:
START
↓
Đọc vị trí Drone
↓
Đọc vị trí B
↓
Tính dx, dy
↓
Tính khoảng cách
↓
Đã đến B?
┌──────┴──────┐
Có Không
↓ ↓
STOP Tính hướng
↓
Tính sai số hướng
↓
Điều khiển Yaw
↓
Điều khiển Roll/Pitch
↓
PID
↓
Motor Mixing
↓
Cập nhật vị trí
↓
Lặp lại
Có thể xây dựng thuật toán cơ bản:
readPosition();
dx = targetX - currentX;
dy = targetY - currentY;
distance = sqrt(dx * dx + dy * dy);
if (distance < tolerance) {
stopDrone();
} else {
targetHeading = atan2(dy, dx);
headingError =
normalizeAngle(targetHeading - currentHeading);
yawCommand = yawController(headingError);
movementCommand =
positionController(dx, dy);
motorMixing(
movementCommand,
yawCommand
);
}
Đây là mô hình phục vụ giảng dạy. Khi triển khai thực tế cần bổ sung giới hạn tốc độ, failsafe và cơ chế chuyển sang điều khiển thủ công.
Giả sử Drone còn cách B:
20 m
có thể di chuyển nhanh hơn.
Nhưng khi chỉ còn:
2 m
nếu vẫn giữ tốc độ cao, Drone có thể bay vượt qua mục tiêu.
Do đó:
Khoảng cách lớn
→ tốc độ cao hơn
Khoảng cách giảm
→ giảm tốc
Gần B
→ tiếp cận chậm
Đạt B
→ Hover / Stop
Đây là nguyên tắc quan trọng để giảm hiện tượng overshoot.
Trong thực tế không nên yêu cầu:
Distance = 0
vì hệ thống định vị luôn có sai số.
Thay vào đó đặt:
Tolerance = 0,5 m
Ví dụ:
Distance < 0,5 m
thì coi như Drone đã đến B.
NAVIGATE
↓
Distance < Tolerance
↓
ARRIVED
↓
HOVER
Giá trị tolerance cần được lựa chọn theo độ chính xác của hệ thống định vị.
Để chương trình dễ quản lý, chia thành các trạng thái:
IDLE
↓
TAKEOFF
↓
NAVIGATE
↓
APPROACH
↓
ARRIVED
↓
HOVER / LAND
Chờ nhiệm vụ.
Cất cánh đến độ cao đặt trước.
Bay về điểm B.
Giảm tốc khi gần B.
Đã vào vùng mục tiêu.
Giữ vị trí.
Hoặc:
Thực hiện hạ cánh.
Sau khi A → B hoạt động, có thể mở rộng:
A → B → C → D
Ví dụ:
A ●──────● B
│
│
● C
│
● D
Chương trình kiểm tra:
Đã đến B?
↓ Có
Chuyển C
Đã đến C?
↓ Có
Chuyển D
Mỗi điểm được gọi là một Waypoint.
Đây là nền tảng của việc lập trình Mission Flight.
Không nên cho Drone bay ngay khi vừa viết thuật toán.
Trước tiên mô phỏng:
A = (0,0)
B = (10,0)
Sau đó giả lập:
(0,0)
(1,0)
(2,0)
(3,0)
...
(10,0)
Khi:
Distance < Tolerance
chuyển:
ARRIVED
Cách này giúp phát hiện lỗi thuật toán trước khi đưa vào Drone thật.
Cho:
A = (0,0)
B = (10,5)
Học viên tính:
dxdyCho:
Current = (3,4)
Target = (8,10)
Viết chương trình ESP32 tính:
dx
dy
distance
targetHeading
Hiển thị kết quả bằng Serial Monitor.
Tạo 4 waypoint:
A = (0,0)
B = (5,0)
C = (5,5)
D = (0,5)
Lập trình:
A → B → C → D
Khi Drone nằm trong vùng tolerance của waypoint hiện tại, chuyển sang waypoint tiếp theo.
Kiểm tra:
Kiểm tra:
Kiểm tra:
Kiểm tra:
Kiểm tra:
Drone nên có hai chế độ:
MANUAL ↔ AUTO
Người điều khiển trực tiếp.
Thuật toán thực hiện nhiệm vụ.
Trong quá trình nghiên cứu, cần có phương án chuyển về MANUAL khi hệ thống tự động hoạt động không đúng.
Đây là một yêu cầu quan trọng khi thiết kế hệ thống điều khiển Drone.
☐ Motor đúng vị trí
☐ Cánh đúng vị trí
☐ Khung chắc chắn
☐ Pin phù hợp
☐ Dây kết nối chắc chắn
☐ MPU6050 hoạt động
☐ Calibration hoàn tất
☐ Vị trí được xác định đúng
☐ Heading hợp lý
☐ Motor Mapping đúng
☐ Sensor Mapping đúng
☐ PID hoạt động
☐ Coordinate system đúng
☐ Waypoint đúng
☐ Tolerance đúng
☐ Có giới hạn tốc độ
☐ Khu vực thử nghiệm thông thoáng
☐ Không có người trong vùng nguy hiểm
☐ Có Manual Override
☐ Có cơ chế dừng phù hợp
atan2() dùng để làm gì?Sau Bài 11, học viên đã chuyển từ:
Điều khiển Drone bằng người
sang:
Drone thực hiện nhiệm vụ theo thuật toán.
Chuỗi xử lý quan trọng cần ghi nhớ:
Vị trí
↓
Điểm mục tiêu
↓
Tính khoảng cách
↓
Tính hướng
↓
Tính sai số
↓
Navigation
↓
Roll / Pitch / Yaw / Throttle
↓
PID
↓
Motor Mixing
↓
Motor
↓
Drone
↓
Cảm biến
↓
Feedback
Nguyên lý cốt lõi:
Drone tự động không đơn giản là cho motor chạy trong một khoảng thời gian. Drone phải liên tục đo trạng thái, so sánh với mục tiêu và điều chỉnh lệnh điều khiển dựa trên sai số.