MAVLink و Telemetry Dashboard یعنی چه؟ (برای مبتدی)
MAVLink (Micro Air Vehicle Link) یک پروتکل ارتباطی سبک است که توسط پهپادهای ArduPilot، PX4 و دیگران برای تبادل داده پرواز استفاده میشود. از طریق یک لینک Telemetry (رادیو 433MHz SiK یا WiFi)، پهپاد پیامهای MAVLink شامل موقعیت GPS، ارتفاع، سرعت، وضعیت باتری، حالت پرواز و صدها پارامتر دیگر را میفرستد.
pymavlink یک کتابخانه Python است که دریافت و ارسال پیامهای MAVLink را ساده میکند. با ترکیب pymavlink و Tkinter (رابط گرافیکی داخلی Python)، میتوانید یک داشبورد مانیتورینگ سفارشی بسازید — دقیقاً اطلاعاتی که میخواهید.
محصولی که میسازید
یک داشبورد Python که ارتفاع، سرعت، ولتاژ، GPS، RSSI و حالت پرواز را در زمان واقعی نمایش میدهد.
- زمان ساخت: ۳ تا ۵ ساعت
- هزینه: رایگان (Python + pymavlink)
- پیشنیاز: Python 3.x نصبشده
نصب کتابخانهها
pip install pymavlink
pip install dronekit # اختیاری — سطح بالاتر از pymavlink
pip install folium # اختیاری — نقشه پرواز HTML
کد داشبورد Python + Tkinter
import tkinter as tk
from pymavlink import mavutil
import threading, time
# اتصال به telemetry (COM4 یا /dev/ttyUSB0)
CONN = 'COM4' # تغییر دهید
master = mavutil.mavlink_connection(CONN, baud=57600)
master.wait_heartbeat()
print("Heartbeat received!")
data = {'alt': 0, 'spd': 0, 'bat': 0.0, 'mode': '---', 'lat': 0, 'lon': 0, 'sats': 0}
def receive_loop():
while True:
try:
msg = master.recv_match(blocking=True, timeout=2)
if not msg: continue
t = msg.get_type()
if t == 'GLOBAL_POSITION_INT':
data['alt'] = msg.relative_alt / 1000
data['lat'] = msg.lat / 1e7
data['lon'] = msg.lon / 1e7
elif t == 'VFR_HUD':
data['spd'] = msg.groundspeed
elif t == 'SYS_STATUS':
data['bat'] = msg.voltage_battery / 1000.0
elif t == 'HEARTBEAT':
modes = {0:'STAB',2:'ALT_H',3:'AUTO',4:'GUIDED',5:'LOITER',6:'RTL',9:'LAND'}
data['mode'] = modes.get(msg.custom_mode,'???')
elif t == 'GPS_RAW_INT':
data['sats'] = msg.satellites_visible
except: pass
threading.Thread(target=receive_loop, daemon=True).start()
root = tk.Tk(); root.title("UAV Telemetry"); root.configure(bg='#0d1117')
root.geometry('700x220')
font_big = ('Courier New', 28, 'bold')
font_med = ('Courier New', 13)
font_lab = ('Courier New', 11)
labels = {}
fields = [
('ALT (m)', 'alt', '#00ff88'),
('SPEED m/s', 'spd', '#ff9f1c'),
('BATTERY V', 'bat', '#ffeb3b'),
('MODE', 'mode', '#4fc3f7'),
]
for i,(lbl,key,col) in enumerate(fields):
tk.Label(root,text=lbl,font=font_lab,bg='#161b22',fg='#8b949e',width=12).grid(row=0,column=i,padx=4,pady=(10,0))
labels[key]=tk.Label(root,text='---',font=font_big,bg='#161b22',fg=col,width=8)
labels[key].grid(row=1,column=i,padx=4,pady=4)
gps_lbl = tk.Label(root,text='GPS: ---',font=font_med,bg='#0d1117',fg='#aaa')
gps_lbl.grid(row=2,column=0,columnspan=4,pady=8)
def update_ui():
labels['alt'].config(text=f"{data['alt']:.1f}")
labels['spd'].config(text=f"{data['spd']:.1f}")
labels['bat'].config(text=f"{data['bat']:.2f}")
labels['mode'].config(text=data['mode'])
gps_lbl.config(text=f"GPS: {data['lat']:.5f}°N {data['lon']:.5f}°E | Sats: {data['sats']}")
root.after(500, update_ui)
update_ui()
root.mainloop()
چکلیست راهاندازی
| مرحله | وضعیت |
|---|---|
| Telemetry Radio به COM متصل است؟ | ☐ Device Manager چک کنید |
| Baud Rate 57600 یا 115200 است؟ | ☐ با SiK Radios 57600 |
| Heartbeat دریافت شد؟ | ☐ پیام در Terminal |
| ارتفاع و سرعت آپدیت میشوند؟ | ☐ |