في مقال أساسيات الطائرات المسيرة عرفنا مكونات الطائرة: الهيكل والمحركات وال ESC والمتحكم والحساسات والبطارية والراديو، وفي مقال المنصات رأينا أن المنصة المفتوحة تعطيك التحكم الكامل بشرط أن تجمع الطائرة بنفسك. والسؤال الآن عملي: كيف تختار هذه القطع حتى تطير الطائرة، وكم تحمل، وكم دقيقة تبقى في الهواء، وكيف توصلها وتضبطها قبل أول إقلاع؟ والحل البسيط أن تشتري قطعاً يقول بائعها إنها «متوافقة» ثم تجرب، ولكن الطائرة التي تحمل وزنها بصعوبة لا تكتشف ذلك إلا وهي في الهواء، وقد تكتشفه وهي تسقط. والطريقة الأنسب أن تحسب قبل أن تشتري، من جداول الاختبار التي تنشرها شركات المحركات نفسها.
وسوف نناقش في هذا المقال ما يلي:
- كيف تتصل القطع ببعضها: الكهرباء والإشارات ومنافذ المتحكم.
- اختيار الهيكل والمراوح والمحركات من جداول الاختبار، ومعنى نسبة الدفع إلى الوزن.
- متحكم السرعة الإلكتروني ESC وبروتوكول DShot، والمتحكم في الطيران Flight Controller وال GPS والبوصلة.
- رابط جهاز التحكم ExpressLRS ورابط القياس عن بعد Telemetry.
- البطارية: عدد الخلايا والسعة ومعامل التفريغ C، والجهد الذي تبدأ وتنتهي عنده.
- تجربة عملية: نحسب نسبة الدفع والوقوف وزمن الطيران من جداول ثلاثة محركات حقيقية، ثم نضبط الطائرة في PX4 SITL ونرى ما يحدث إذا أخطأنا في اتجاه محرك.
- ترتيب التجميع، والمعايرة، وقائمة الأمان قبل أول إقلاع.
كيف تتصل القطع ببعضها
قبل اختيار أي قطعة، انظر إلى الصورة التالية، فهي تبين مسارين منفصلين في الطائرة: مسار الكهرباء من البطارية، ومسار الإشارات والبيانات بين المتحكم وكل شيء آخر:

في الصورة أعلاه لاحظ التالي:
- التيار الكبير يذهب من البطارية إلى ال ESCs ثم المحركات، ولا يمر بالمتحكم أبداً، فالمتحكم يأخذ من وحدة الطاقة Power Module كهرباء 5 فولت فقط، مع قراءة الجهد والتيار حتى يعرف كم بقي في البطارية.
- المتحكم يرسل إلى كل ESC إشارة رقمية بالسرعة المطلوبة، ولا يرسل كهرباء المحرك نفسها.
- كل ما حول المتحكم يتصل بمنفذ له اسم، وفي متحكمات Pixhawk هذه الأسماء ثابتة مثل GPS1 وTELEM1 وPOWER1، وهذا ما يعنيه معيار الموصلات الذي ذكرناه في مقال المنصات.
الهيكل والمراوح والمحركات
هذه القطع الثلاث تختار معاً وليس كل واحدة وحدها، والسبب أن المحرك لا يعطي دفعاً بمفرده، وإنما يعطي دفعاً بمروحة محددة وجهد محدد، والهيكل يحدد أكبر مروحة تستطيع أن تركبها دون أن تلمس المراوح بعضها. ومقاس الهيكل يكتب عادة بالمسافة القطرية بين محورين متقابلين Wheelbase، فهيكل Holybro X500 V2 مثلاً مسافته القطرية 500 مم، والمحركات والمراوح في طقمه هي محرك 2216 KV920 ومروحة 10 بوصات بخطوة 4.5 بوصة، أما طائرات FPV الصغيرة فهياكلها لمراوح 5 بوصات.
وأما رقم KV على المحرك فهو رقم سرعة يكتبه المصنع، والمحرك ذو KV الأعلى يدور أسرع بالجهد نفسه، فيركب عليه مروحة أصغر. وأوضح طريقة لترى ذلك هي جداول الاختبار نفسها: في صفحة محرك T-Motor Velox V2207 V2 بنسخة KV2550 على بطارية 4S ومروحة 5.1 بوصة، يدور المحرك 26774 دورة في الدقيقة عند أقصى سرعة، بينما محرك X500 بنسخة KV920 ومروحة 10 بوصات يدور 9857 دورة فقط عند أقصى سرعة في جدول Holybro. فالمحرك الأول صغير سريع بمروحة صغيرة، والثاني أبطأ بمروحة أكبر، والفرق في الكفاءة كبير كما سوف ترى في التجربة، وهذا ما تقوله صفحة تصميم الطائرات متعددة المراوح المؤرشفة في توثيق ArduPilot: المحركات ذات KV المنخفض مع المراوح الكبيرة هي الأكفأ وتعطي أطول زمن طيران.
نسبة الدفع إلى الوزن ونسبة الوقوف
نسبة الدفع إلى الوزن Thrust-to-Weight Ratio هي مجموع أقصى دفع للمحركات مقسوماً على وزن الطائرة الكلي All-Up Weight، أي وزنها جاهزة للطيران مع البطارية وكل ما تحمله. ولكن الرقم الأهم في الواقع هو نسبة الوقوف Hover Throttle، أي كم يحتاج المحرك من سرعته القصوى حتى تقف الطائرة في الهواء، وتوثيق ArduPilot في صفحة Altitude Hold يقول إن الطائرة يجب أن تقف تقريباً عند 50% من الدفع، وإن أي شيء فوق 70% خطير. والسبب ما رأيناه في مقال الأساسيات: الطائرة لا تميل ولا تقاوم الريح إلا بتسريع بعض المحركات فوق سرعة الوقوف، فإذا كانت المحركات قريبة من أقصاها وهي واقفة فلن يبقى للمتحكم مجال للتصحيح.
وقد يتساءل البعض: وهل أثق في جداول الشركات؟ والإجابة أنها أفضل ما تبدأ به، ولكن ArduPilot نفسه يقول في صفحة الإعداد قبل الضبط إن بيانات المصنعين عن منحنى الدفع غالباً غير دقيقة فلا تثق بها لضبط الطائرة، والجداول نفسها مقاسة على محرك واحد على منصة اختبار بجهد ثابت، وتحتها في صفحة T-Motor ملاحظة بأنها للاستئناس فقط. لذلك استخدمها لتختار القطع وتتجنب الخطأ الكبير، ثم اترك هامشاً، ثم اعتمد على سجل الطيران الحقيقي بعد أول وقوف.
متحكم السرعة الإلكتروني ESC
ال ESC هو الذي يحول إشارة المتحكم إلى تيار يدير المحرك، وأول ما تقارنه فيه هو التيار المستمر الذي يتحمله مقابل أقصى تيار يسحبه المحرك في جدول الاختبار. ففي طقم X500 V2 ال ESC من نوع BLHeli S بتيار مستمر 20 أمبير، والمحرك في جدوله يسحب 16.37 أمبير عند أقصى سرعة، فيبقى هامش مناسب.
والشيء الثاني هو البروتوكول الذي يتحدث به المتحكم مع ال ESC، والشائع اليوم DShot، ويذكر توثيق PX4 أنه بروتوكول رقمي فيه تأخير أقل، وفيه مجموع تحقق Checksum يجعله أقوى، ولا يحتاج معايرة لل ESC لأنه رقمي، ويسمح بعكس اتجاه دوران المحرك بأمر بدل أن تفك الأسلاك وتلحمها من جديد، وتذكر سرعاته DShot150 وDShot300 وDShot600، والرقم هو السرعة بالكيلوبت في الثانية. ويقول توثيق ArduPilot الشيء نفسه: ال ESCs التي تعمل بـ DShot لا تحتاج معايرة.
المتحكم وال GPS والبوصلة
المتحكم في الطيران Flight Controller هو الحاسوب الذي يعمل عليه الطيار الآلي، وفي عالم PX4 وArduPilot الخيار الأسهل للمبتدئ متحكم يتبع معيار Pixhawk، مثل Pixhawk 6C الذي يعرضه موقع Holybro بسعر 199 دولاراً للنسخة البلاستيكية دون وحدة طاقة، و217.99 دولاراً مع وحدة الطاقة PM02، كما قرأناه في 12 أكتوبر 2026. وفي التركيب ثلاث نقاط مهمة: أن يكون في مركز الطائرة قدر الإمكان، وأن يكون سهمه إلى الأمام، وأن يركب على قاعدة تخفف الاهتزاز، والسبب أن الحساسات داخله هي التي يقيس بها الطيار الآلي ميل الطائرة، والاهتزاز يفسد هذه القراءات، ويقول توثيق تحليل السجلات في PX4 إن اهتزازاً أكبر من 2 إلى 3 م/ث² من القمة إلى القمة يعد اهتزازاً قوياً.
وأما وحدة ال GPS فيكون فيها في الغالب البوصلة أيضاً، مثل Holybro M10 GPS بسعر 43.99 دولاراً في التاريخ نفسه، وتركب على عمود مرتفع بعيداً عن أسلاك الكهرباء والبطارية، والسبب كما ذكرنا في مقال الأساسيات أن البوصلة تتأثر بالمعادن والتيار القريب منها، والبوصلة الخاطئة تجعل الطائرة تدور في دوائر وهي تحاول أن تقف.
رابط جهاز التحكم ورابط القياس عن بعد
في الطائرة رابطان لاسلكيان منفصلان كما رأينا في مقال الأساسيات. الأول رابط جهاز التحكم RC، وأشهر رابط مفتوح اليوم هو ExpressLRS برخصة GPL-3.0، ويقول موقعه إنه يعمل على ترددي 900 ميجاهرتز و2.4 جيجاهرتز بمعدل يصل إلى 1000 حزمة في الثانية، والمستقبل Receiver الصغير يتصل بالمتحكم بمنفذ تسلسلي UART ببروتوكول CRSF. والثاني رابط القياس عن بعد Telemetry الذي يحمل MAVLink إلى محطة التحكم الأرضية، ويتصل بالمنفذ TELEM1. ولا تقم بالاعتماد على رابط القياس وحده للتحكم في الطائرة، والسبب أن جهاز التحكم في يد الطيار هو الذي يستطيع أن يتدخل في لحظة، وهذا شرط نظامي أيضاً كما في مقال الأنظمة.
البطارية: معامل C والخلايا والسعة
- عدد الخلايا S: يقول توثيق البطارية في PX4 إن الجهد الاسمي Nominal لخلية الليثيوم بوليمر LiPo هو 3.7 فولت، فبطارية 4S جهدها الاسمي 14.8 فولت، و6S جهدها 22.2 فولت، والرقم مع حرف S مكتوب على البطارية نفسها. وتقول تعليمات Gens Ace وTattu إن أقصى جهد للخلية عند الشحن 4.2 فولت، وإن جهد التخزين الطويل بين 3.6 و3.9 فولت للخلية، فلا تقم بتخزين البطارية مشحونة بالكامل أسابيع.
- السعة mAh: هي كمية الشحنة، ويقول توثيق PX4 أن تضبط المعامل
BAT1_CAPACITYعلى قرابة 90% من السعة المكتوبة، فلا تتوقع أن تأخذ من البطارية رقمها كاملاً. - معامل التفريغ C: مضاعف للسعة يحدد أقصى تيار مستمر، ومثال توثيق PX4 أن بطارية 2000 mAh بمعامل 10C تعطي 20 أمبير باستمرار. فبطارية 5000 mAh بمعامل 20C، وهي في حدود ما يقترحه Holybro لطائرة X500 V2، تعطي 100 أمبير، وأقصى ما تسحبه المحركات الأربعة في جدولها 4 × 16.37 أي قرابة 65.5 أمبير، فالبطارية كافية.
- متى تهبط: يذكر توثيق PX4 أن الحد الأدنى «الحقيقي» للخلية تحت الحمل أثناء الطيران قرابة 3.5 فولت، وأن 3.0 فولت تحت الحمل تتلف البطارية.
التجربة العملية: نحسب قبل أن نشتري
التجربة من جزأين: سكربت Python يحسب من جداول الاختبار المنشورة، ثم محاكاة PX4 SITL نضبط فيها الطائرة ونرى هل يتفق ما يقيسه الطيار الآلي مع الحساب، ثم نكسر الإعداد بخطأ توصيل شائع.
الحساب من جداول الاختبار
السكربت thrust_calc.py يحمل صفوف ثلاثة جداول كما نشرتها الشركات: محرك X500 V2 من الصورة التي يربطها Holybro في صفحة الطقم بعنوان «Motor specification»، ومحرك T-Motor MN3508 KV380 بمروحة 15 بوصة على 6S من صفحته، ومحرك Velox V2207 V2 من صورة تقرير الاختبار في صفحته، ثم يحسب لكل وزن كلي نسبة الدفع إلى الوزن، ونسبة الوقوف بالاستكمال الخطي بين صفين، والتيار عند الوقوف، والزمن على 80% من البطارية، وهذه نسبة اخترناها نحن لنترك احتياطاً وليست رقماً من أي مرجع. والسكربت كاملاً في البطاقة التالية:
thrust_calc.py كاملاً
"""Thrust-to-weight, hover throttle and hover time from the motor makers' own bench tables.
python3 thrust_calc.py [all-up weight in grams for the X500 build]
The tables are copied from the makers' pages (read 2026-10-12); every row is: throttle %, thrust g, current A.
Bench data is measured on one motor at a fixed supply voltage: treat the results as a first estimate.
"""
import sys
MOTORS = {
# Holybro X500 V2 kit motor AIR2216II KV920 with T1045II (10x4.5") at 16 V, image linked from
# https://holybro.com/products/x500-v2-kits ("Motor specification")
"X500 V2: 2216 KV920 + 10x4.5 @16V": {
"cells": 4, "rows": [(30, 210, 1.44), (35, 259, 1.87), (40, 309, 2.29), (45, 373, 2.86), (50, 447, 3.60),
(55, 536, 4.53), (60, 628, 5.61), (65, 729, 6.78), (70, 814, 7.92), (75, 906, 9.20),
(80, 993, 10.59), (85, 1087, 12.11), (90, 1191, 13.81), (95, 1289, 15.68),
(100, 1332, 16.37)]},
# T-Motor MN3508 KV380 with T-MOTOR 15*5CF at 22.2 V (6S), https://store.tmotor.com/goods-354-MN3508.html
"MN3508 KV380 + 15x5 @22.2V": {
"cells": 6, "rows": [(50, 820, 3.6), (65, 1200, 6.1), (75, 1500, 9.5), (85, 1700, 11.3), (100, 1880, 13.3)]},
# T-Motor Velox V2207 V2 KV2550 with T5143S at about 15.7 V (4S),
# https://www.t-hobby.com/products/fpv-brushless-motor-v2207-v2 (test report image)
"V2207 V2 KV2550 + 5.1\" @4S": {
"cells": 4, "rows": [(50, 434.91, 8.04), (55, 504.63, 9.86), (60, 582.38, 12.03), (65, 667.20, 14.43),
(70, 751.66, 17.08), (75, 826.58, 19.89), (80, 891.57, 22.78), (85, 957.23, 25.34),
(90, 1006.71, 27.78), (95, 1089.01, 30.94), (100, 1195.21, 34.18)]},
}
def at_thrust(rows, grams):
"""Linear interpolation between the two bench rows around the wanted thrust per motor."""
if grams < rows[0][1]:
return None # below the first published row: the table cannot tell
if grams > rows[-1][1]:
return "over" # more than the motor gives at full throttle
for (t1, g1, a1), (t2, g2, a2) in zip(rows, rows[1:]):
if g1 <= grams <= g2:
k = (grams - g1) / (g2 - g1)
return t1 + k * (t2 - t1), a1 + k * (a2 - a1)
def report(name, auw, motors, capacity_mah, usable=0.8):
m = MOTORS[name]
rows, per_motor = m["rows"], auw / motors
max_thrust = motors * rows[-1][1]
print(f"\n{name}: all-up weight {auw:.0f} g, {motors} motors, {m['cells']}S {capacity_mah} mAh")
print(f" max thrust {max_thrust:.0f} g -> thrust-to-weight {max_thrust / auw:.2f} : 1")
r = at_thrust(rows, per_motor)
if r is None:
print(f" hover needs {per_motor:.0f} g per motor, below the first row ({rows[0][1]:.0f} g at {rows[0][0]}%):"
f" hover throttle is under {rows[0][0]}%")
t, a = rows[0][0], rows[0][2]
print(f" flying at {t}% the four motors draw {motors * a:.1f} A -> {usable * capacity_mah / 1000 / (motors * a) * 60:.1f} min"
f" on {usable:.0%} of the pack")
return
if r == "over":
print(f" hover needs {per_motor:.0f} g per motor: MORE than full throttle gives. It will not fly.")
return
t, a = r
total_a = motors * a
verdict = "good (about 50%)" if t <= 55 else "acceptable" if t <= 70 else "too high, over 70%"
print(f" hover: {per_motor:.0f} g per motor at about {t:.0f}% throttle ({verdict})")
print(f" hover current {total_a:.1f} A for the motors -> {usable * capacity_mah / 1000 / total_a * 60:.1f} min"
f" on {usable:.0%} of the pack (motors only, no electronics, still air)")
if __name__ == "__main__":
auw = float(sys.argv[1]) if len(sys.argv) > 1 else 2000
print("bench data: makers' tables read 2026-10-12; usable = share of the pack we plan to use")
for w in (auw - 500, auw, auw + 500, auw + 1500):
report("X500 V2: 2216 KV920 + 10x4.5 @16V", w, 4, 5000)
report("V2207 V2 KV2550 + 5.1\" @4S", 700, 4, 1550) # T-Hobby page: "Takeoff Weight: 700g with 4S Battery"
print("\ngrams of thrust per watt at 50% throttle (from the same tables, P = V x A):")
volts = {"X500 V2: 2216 KV920 + 10x4.5 @16V": 16.0, "MN3508 KV380 + 15x5 @22.2V": 22.2,
"V2207 V2 KV2550 + 5.1\" @4S": 15.74}
for name, m in MOTORS.items():
t, g, a = next(r for r in m["rows"] if r[0] == 50)
print(f" {name:36s} {g:7.1f} g / {volts[name] * a:6.1f} W = {g / (volts[name] * a):5.2f} g/W")
الأمر التالي يشغله بوزن كلي 2000 جرام، فيحسب أيضاً 1500 و2500 و3500:
python3 thrust_calc.py 2000والمخرج سوف يكون كما يلي:
bench data: makers' tables read 2026-10-12; usable = share of the pack we plan to use
X500 V2: 2216 KV920 + 10x4.5 @16V: all-up weight 1500 g, 4 motors, 4S 5000 mAh
max thrust 5328 g -> thrust-to-weight 3.55 : 1
hover: 375 g per motor at about 45% throttle (good (about 50%))
hover current 11.5 A for the motors -> 20.8 min on 80% of the pack (motors only, no electronics, still air)
X500 V2: 2216 KV920 + 10x4.5 @16V: all-up weight 2000 g, 4 motors, 4S 5000 mAh
max thrust 5328 g -> thrust-to-weight 2.66 : 1
hover: 500 g per motor at about 53% throttle (good (about 50%))
hover current 16.6 A for the motors -> 14.4 min on 80% of the pack (motors only, no electronics, still air)
X500 V2: 2216 KV920 + 10x4.5 @16V: all-up weight 2500 g, 4 motors, 4S 5000 mAh
max thrust 5328 g -> thrust-to-weight 2.13 : 1
hover: 625 g per motor at about 60% throttle (acceptable)
hover current 22.3 A for the motors -> 10.8 min on 80% of the pack (motors only, no electronics, still air)
X500 V2: 2216 KV920 + 10x4.5 @16V: all-up weight 3500 g, 4 motors, 4S 5000 mAh
max thrust 5328 g -> thrust-to-weight 1.52 : 1
hover: 875 g per motor at about 73% throttle (too high, over 70%)
hover current 35.1 A for the motors -> 6.8 min on 80% of the pack (motors only, no electronics, still air)
V2207 V2 KV2550 + 5.1" @4S: all-up weight 700 g, 4 motors, 4S 1550 mAh
max thrust 4781 g -> thrust-to-weight 6.83 : 1
hover needs 175 g per motor, below the first row (435 g at 50%): hover throttle is under 50%
flying at 50% the four motors draw 32.2 A -> 2.3 min on 80% of the pack
grams of thrust per watt at 50% throttle (from the same tables, P = V x A):
X500 V2: 2216 KV920 + 10x4.5 @16V 447.0 g / 57.6 W = 7.76 g/W
MN3508 KV380 + 15x5 @22.2V 820.0 g / 79.9 W = 10.26 g/W
V2207 V2 KV2550 + 5.1" @4S 434.9 g / 126.5 W = 3.44 g/Wوالصورة التالية ترسم جدول محرك X500 V2 نفسه، وعليه نقاط الوقوف للأوزان الأربعة:

في المخرج أعلاه لاحظ التالي:
- الوزن يغير كل شيء: الطائرة نفسها تقف عند 45% بوزن 1.5 كيلوجرام، وعند 73% بوزن 3.5 كيلوجرام، أي فوق حد ArduPilot، وزمن الطيران المحسوب ينزل من 20.8 دقيقة إلى 6.8 دقائق. ولهذا تذكر صفحة الطقم حمولة 1500 جرام دون البطارية عند 70% من الدفع، وهذا يتفق مع الجدول: أربعة محركات عند 70% تعطي 4 × 814 أي 3256 جراماً.
- قارن بما تقوله الشركة: صفحة X500 V2 تذكر قرابة 18 دقيقة وقوف بلا حمولة ببطارية 5000 mAh، والسكربت يعطي بين 14.4 و20.8 دقيقة للوزنين 2 و1.5 كيلوجرام، وهو لا يحسب استهلاك المتحكم والراديو، ولا يعرف الوزن الحقيقي لطائرتك، لذلك هو تقدير أولي يضعك في المنطقة الصحيحة وليس وعداً.
- طائرة FPV مختلفة تماماً: نسبة الدفع 6.83 إلى 1 بوزن 700 جرام الذي تذكره صفحة المحرك، ونسبة الوقوف أقل من أول صف في الجدول، فالجدول لا يبدأ من الصفر، ولكن الطيران عند 50% يستهلك 32.2 أمبير فتنتهي البطارية في دقيقتين ونصف تقريباً، وهذا ثمن السرعة.
- الكفاءة: الأرقام الثلاثة الأخيرة تطابق عمود الكفاءة g/W في جداول الشركات نفسها (7.76 و10.26 و3.44)، وهذا يؤكد أن السكربت يقرأ الجداول صحيحاً، ويبين الفرق: المروحة 15 بوصة تعطي ثلاثة أضعاف ما تعطيه مروحة 5 بوصات من الدفع لكل واط.
الإعداد في PX4 SITL ومقارنة الحساب بالطيار الآلي
لا نملك طائرة، ولكن PX4 في المحاكاة يحمل طائرة باسم x500، وأرقامها مكتوبة في ملفاتها، فنحسب لها بالطريقة نفسها ثم نرى ماذا يقيس الطيار الآلي وهو يطير. أولاً نقرأ ملفات الطائرة من Docker Image التي استخدمناها في مقال البرمجة:
docker run --rm --name lab-drone2-check --entrypoint bash jonasvautherin/px4-gazebo-headless:1.17.0 -c \
'cd /root/px4; grep -m1 "<mass>" Tools/simulation/gz/models/x500_base/model.sdf
grep -m3 -E "turningDirection|maxRotVelocity|motorConstant" Tools/simulation/gz/models/x500/model.sdf
grep -E "SIM_GZ_EC_(MIN|MAX)1 |MPC_THR_HOVER" ROMFS/px4fmu_common/init.d-posix/airframes/4001_gz_x500' <mass>2.0</mass>
<turningDirection>ccw</turningDirection>
<maxRotVelocity>1000.0</maxRotVelocity>
<motorConstant>8.54858e-06</motorConstant>
param set-default SIM_GZ_EC_MIN1 150
param set-default SIM_GZ_EC_MAX1 1000
param set-default MPC_THR_HOVER 0.60في المخرج أعلاه لاحظ أن جسم الطائرة 2 كيلوجرام، ومعها في الملف نفسه أربع مراوح وزن كل منها قرابة 16 جراماً، وأن الدفع في المحاكي يساوي motorConstant مضروباً في مربع سرعة الدوران، وأقصى سرعة 1000 راديان في الثانية، وأن مخرج PX4 من 0 إلى 1 يتحول إلى سرعة بين 150 و1000. والسكربت التالي يحسب منها ما حسبناه للطقم الحقيقي:
"""The same calculation for PX4's simulated x500 (Gazebo), from the numbers in its model and airframe files:
model.sdf: base mass 2.0 kg + 4 rotors of 0.016077 kg, motorConstant 8.54858e-06 (thrust N = k * w^2),
maxRotVelocity 1000 rad/s; airframe 4001_gz_x500: SIM_GZ_EC_MIN 150, SIM_GZ_EC_MAX 1000 (rad/s for output 0..1).
python3 sim_x500.py
"""
import math
G = 9.81
mass = 2.0 + 4 * 0.016076923076923075 # kg
k, w_min, w_max = 8.54858e-06, 150.0, 1000.0
max_thrust_g = k * w_max ** 2 / G * 1000 # per motor
w_hover = math.sqrt(mass * G / 4 / k)
print(f"all-up weight {mass * 1000:.0f} g, max thrust {max_thrust_g:.0f} g per motor, "
f"thrust-to-weight {4 * max_thrust_g / (mass * 1000):.2f} : 1")
print(f"hover: {w_hover:.0f} rad/s -> motor output {(w_hover - w_min) / (w_max - w_min):.2f} (0..1)")all-up weight 2064 g, max thrust 871 g per motor, thrust-to-weight 1.69 : 1
hover: 770 rad/s -> motor output 0.73 (0..1)أي أن طائرة المحاكاة أضعف من الطقم الحقيقي بحسب جدول Holybro، فنسبتها 1.69 مقابل 2.66 للوزن نفسه تقريباً، ويجب أن تقف قرب 0.73. الآن نشغل PX4، ونضبط البطارية بالقيم التي شرحناها، ونعطيه عن قصد تقديراً مختلفاً لنسبة الوقوف هو 0.53، أي ما حسبناه للطقم الحقيقي، ثم نطلب التشغيل:
docker run -dit --name lab-drone2-px4 jonasvautherin/px4-gazebo-headless:1.17.0
docker exec lab-drone2-px4 bash -c 'cd /root/px4/build
./bin/px4-param set BAT1_CAPACITY 4500
./bin/px4-param set BAT1_V_EMPTY 3.5
./bin/px4-param set MPC_THR_HOVER 0.53
./bin/px4-commander arm'
docker logs lab-drone2-px4 | grep -E "Preflight Fail: No connection|Arming denied" BAT1_CAPACITY: curr: -1.0000 -> new: 4500.0000
BAT1_V_EMPTY: curr: 3.6000 -> new: 3.5000
MPC_THR_HOVER: curr: 0.6000 -> new: 0.5300
WARN [health_and_arming_checks] Preflight Fail: No connection to the GCS
WARN [commander] Arming denied: Resolve system health failures firstرفض PX4 التشغيل، وهذه من فحوص ما قبل التشغيل التي سوف نعود إليها في آخر المقال: إعداد هذه المحاكاة يجعل الطائرة تعود إذا فقدت محطة التحكم كما رأينا في مقال البرمجة، ولا توجد محطة في هذه التجربة، فرفض الطيار الآلي أن يقلع دونها. ولأننا في محاكاة بلا محطة نلغي هذا الفعل بالمعامل NAV_DLL_ACT، ولا تقم بذلك على طائرة حقيقية، ثم نقلع وننتظر:
docker exec lab-drone2-px4 bash -c 'cd /root/px4/build
./bin/px4-param set NAV_DLL_ACT 0
./bin/px4-commander arm; sleep 1; ./bin/px4-commander takeoff; sleep 45
./bin/px4-listener hover_thrust_estimate -n 1
./bin/px4-listener actuator_motors -n 1 | grep control
./bin/px4-listener battery_status -n 1 | grep -E "voltage_v|remaining:"'والمخرج سوف يكون كما يلي (حذفنا بعض حقول الرسائل):
NAV_DLL_ACT: curr: 2 -> new: 0
TOPIC: hover_thrust_estimate
hover_thrust_estimate
hover_thrust: 0.73000
hover_thrust_var: 0.00000
valid: True
control: [0.72045, 0.72029, 0.72035, 0.72044, nan, nan, nan, nan, nan, nan, nan, nan]
voltage_v: 15.10000
remaining: 0.50064في المخرج أعلاه لاحظ التالي:
- بدأنا بتقدير 0.53، والطيار الآلي قدر نسبة الوقوف بنفسه أثناء الطيران فوصل إلى 0.73، وهو ما حسبناه من ملفات الطائرة تماماً، والمحركات الأربعة تعمل عند 0.72. ويقول مرجع المعاملات إن
MPC_THR_HOVERقيمة ابتدائية لمقدر الوقوف وإنها مهمة لاكتشاف الهبوط، لذلك ضع فيها ما يقوله حسابك، ثم صححها من السجل بعد أول طيران. - الحساب نفسه يعمل في الاتجاهين: إذا كانت نسبة الوقوف في سجل طائرتك الحقيقية أعلى كثيراً مما حسبته، فإما أن الوزن أكبر مما تظن، أو أن المحركات والمراوح لا تعطي ما في الجدول.
- البطارية في المحاكاة افتراضية تفرغ حتى 50% ثم تتوقف بحسب المعامل
SIM_BAT_MIN_PCT، فلا تستنتج من أرقامها زمن طيران.
وأما الطقم الحقيقي فله ملف إطار جاهز في PX4 نفسه، هو الإطار 4019 الذي تختاره في QGroundControl عند الإعداد، وهذا جزء منه من الملف ROMFS/px4fmu_common/init.d/airframes/4019_x500_v2 في Docker Image نفسها:
# @name Holybro X500 V2
# @type Quadrotor x
# @class Copter
. ${R}etc/init.d/rc.mc_defaults
param set-default IMU_GYRO_CUTOFF 30
param set-default MC_ROLLRATE_P 0.14
param set-default MC_PITCHRATE_P 0.14
# Square quadrotor X PX4 numbering
param set-default CA_ROTOR_COUNT 4
param set-default CA_ROTOR0_PX 1
param set-default CA_ROTOR0_PY 1
param set-default CA_ROTOR1_PX -1
param set-default CA_ROTOR1_PY -1
param set-default CA_ROTOR2_PX 1
param set-default CA_ROTOR2_PY -1
param set-default CA_ROTOR2_KM -0.05
param set-default CA_ROTOR3_PX -1
param set-default CA_ROTOR3_PY 1
param set-default CA_ROTOR3_KM -0.05ولاحظ أن ملف الإطار لا يذكر الوزن ولا البطارية ولا نسبة الوقوف، فهذه عليك أنت، وأنه يحدد ترتيب المحركات وموقعها واتجاهها، أي أن المحرك رقم 1 في الأمام اليمين كما شرحنا في مقال الأساسيات، وما يحدث إذا لم توصله في مكانه هو موضوع الكسر التالي.
نكسر الإعداد: محركان في غير مكانهما
أشهر خطأ في أول تجميع أن توصل ال ESC الخاص بمحرك في مخرج محرك آخر على المتحكم. وفي المحاكاة نفعل الشيء نفسه بتبديل وظيفتي المخرجين 1 و3 بالمعاملين SIM_GZ_EC_FUNC1 وSIM_GZ_EC_FUNC3، فيذهب أمر المحرك الأمامي الأيمن إلى المحرك الأمامي الأيسر وبالعكس، على Container جديد، ثم نقلع ونقرأ ميل الطائرة وارتفاعها كل ثانية ونصف:
docker rm -f lab-drone2-px4
docker run -dit --name lab-drone2-px4 jonasvautherin/px4-gazebo-headless:1.17.0
docker exec lab-drone2-px4 bash -c 'cd /root/px4/build
./bin/px4-param set NAV_DLL_ACT 0
./bin/px4-param set SIM_GZ_EC_FUNC1 103
./bin/px4-param set SIM_GZ_EC_FUNC3 101
./bin/px4-commander arm; sleep 1; ./bin/px4-commander takeoff
for i in 1 2 3 4 5 6 7 8; do sleep 1.5
./bin/px4-listener vehicle_attitude -n 1 | grep "q:"
./bin/px4-listener vehicle_local_position -n 1 | grep -E "^\s+z:"; done' NAV_DLL_ACT: curr: 2 -> new: 0
SIM_GZ_EC_FUNC1: curr: 101 -> new: 103
SIM_GZ_EC_FUNC3: curr: 103 -> new: 101
q: [0.66926, 0.00006, 0.00014, 0.74303] (Roll: 0.0 deg, Pitch: 0.0 deg, Yaw: 96.0 deg)
z: -0.01176
q: [0.66926, 0.00018, -0.00017, 0.74303] (Roll: -0.0 deg, Pitch: -0.0 deg, Yaw: 96.0 deg)
z: -0.00479
q: [0.75854, -0.08309, 0.46281, -0.45113] (Roll: -44.3 deg, Pitch: 38.8 deg, Yaw: -77.8 deg)
z: -0.61023
q: [-0.77105, 0.49188, -0.25112, 0.31697] (Roll: -67.0 deg, Pitch: 4.3 deg, Yaw: -47.6 deg)
z: 0.91102
q: [0.42744, 0.23892, -0.78764, 0.37395] (Roll: -132.7 deg, Pitch: -58.4 deg, Yaw: -173.8 deg)
z: -0.43210
q: [-0.45157, 0.06184, -0.13251, -0.88017] (Roll: 10.5 deg, Pitch: 13.2 deg, Yaw: 126.9 deg)
z: 1.89798
q: [-0.71834, -0.17942, 0.66973, -0.05711] (Roll: 78.0 deg, Pitch: -79.3 deg, Yaw: -58.7 deg)
z: -1.18180
q: [0.42508, 0.86023, 0.28157, -0.00564] (Roll: 131.2 deg, Pitch: 14.4 deg, Yaw: 29.7 deg)
z: -1.05881وفي سجل PX4 نفسه:
INFO [commander] Armed by internal command
INFO [navigator] Using default takeoff altitude: 2.5 m
INFO [commander] Takeoff detected
WARN [health_and_arming_checks] Preflight Fail: Attitude failure (roll)
WARN [health_and_arming_checks] Compass needs calibration - Land now!
WARN [health_and_arming_checks] Preflight Fail: Compass 0 faultفي المخرج أعلاه لاحظ التالي:
- في أقل من ثلاث ثوان من الإقلاع مالت الطائرة 44 درجة جانبياً و39 درجة إلى الأمام، ثم انقلبت أكثر من مرة، وارتفاعها
zيتقلب حول الصفر، أي أنها تتدحرج على الأرض. والسبب أن الطيار الآلي عندما يريد أن يصحح ميلاً صغيراً يسرع المحرك الذي يظنه في الأمام اليمين، فيسرع في الحقيقة المحرك الأمامي الأيسر، فيزيد الميل بدل أن يصححه، وكل تصحيح يزيد الخطأ. - كشف PX4 فشل الميل Attitude Failure، ثم ظهرت مشكلة في البوصلة بعد التدحرج، ولكن الطائرة بقيت في حالة التشغيل Armed، والسبب أن إنهاء الطيران Flight Termination معطل افتراضياً بالمعامل
CBRK_FLIGHTTERMوقيمته الافتراضية في مرجع المعاملات 121212. وفي طائرة حقيقية هذا يعني مراوح تدور وهي تتدحرج على الأرض بجانبك. - وهذا الخطأ لا تكتشفه الحسابات، وإنما تكتشفه باختبار المحركات قبل تركيب المراوح، فتشغل كل محرك وحده من QGroundControl وتتأكد أنه الذي في المكان الصحيح ويدور في الاتجاه الصحيح.
تنظيف المختبر
docker rm -f lab-drone2-px4ترتيب التجميع
الصورة التالية تبين ترتيب العمل من الهيكل إلى أول وقوف، ولاحظ أين تأتي المراوح:

- الهيكل والمحركات: ركب المحركات في أماكنها بحسب ترتيب الإطار الذي سوف تختاره في البرنامج، وفي طقم X500 V2 تقول صفحة PX4 عن الطقم إن اللوح السفلي يبين اتجاه كل محرك.
- الكهرباء: وصل ال ESCs ووحدة الطاقة والبطارية، وتأكد بجهاز القياس أنه لا يوجد تماس بين الموجب والسالب قبل أول توصيل للبطارية.
- المتحكم: في المركز وسهمه إلى الأمام وعلى قاعدة تخفف الاهتزاز.
- ال GPS والراديو: ال GPS على عموده بعيداً عن الأسلاك، والمستقبل وهوائياته بعيداً عن ألياف الكربون والمعادن.
- البرنامج والإعداد: ثبت PX4 أو ArduPilot من QGroundControl، واختر الإطار Airframe الصحيح، وفي ArduPilot يقابله المعاملان
FRAME_CLASSوFRAME_TYPEكما في صفحة نوع الإطار، ثم اضبط المنافذ والبطارية كما في التجربة. - المعايرة: معايرة الحساسات والبوصلة وجهاز التحكم، ثم اختبار المحركات واحداً واحداً، ويقول توثيق PX4 بوضوح: انزع المراوح قبل تعيين المخارج أو أي اختبار.
- المراوح: كل مروحة لاتجاه دوران محدد، ويقول توثيق ArduPilot إن الحافة السميكة هي الحافة الأمامية التي تتحرك في اتجاه الدوران، وفي طقم X500 V2 المراوح المطلية بالأبيض أو الفضي تركب على المحركات التي عليها العلامة نفسها.
- أول وقوف: في مكان مفتوح بعيد عن الناس، على ارتفاع منخفض، ثم انزل واقرأ السجل قبل أي شيء آخر، كما سوف نشرح في مقال التطوير.
قبل أول إقلاع
- فحوص ما قبل التشغيل Pre-arm Checks: الطيار الآلي يرفض أن يشغل المحركات إذا وجد مشكلة في الحساسات أو المعايرة أو البطارية، ويقول توثيق ArduPilot لا تقم بتعطيل هذه الفحوص أبداً إلا لاختبار على الطاولة، والسبب أن كل رسالة رفض تخبرك بشيء سوف يسقط الطائرة لو تجاهلته.
- الحماية عند الأعطال: اضبط ما تفعله الطائرة عند فقدان جهاز التحكم وفقدان ال GPS والسياج الجغرافي، وقد رأينا في مقال البرمجة أن القيم الافتراضية قد لا تكون ما تتوقعه.
- البطارية: مشحونة ومتوازنة الخلايا، ومثبتة بحزام لا يتحرك.
- النظام: الطائرة المجمعة بيدك لا تحمل علامة فئة، وتقول صفحة EASA إن الطائرات بلا علامة هي المبنية بيد أصحابها أو المطروحة قبل 31 ديسمبر 2023، أما في السعودية فالتسجيل والشهادة والتصريح كما في مقال الأنظمة، بغض النظر عن أنك جمعتها بنفسك.
قائمة القطع والأسعار
الأسعار التالية من موقع Holybro كما قرأناها في 12 أكتوبر 2026، بالدولار ودون الشحن والجمارك، وهي مثال على طائرة X500 V2 بمتحكم Pixhawk 6C، ولم نجد أسعاراً موثوقة من متاجر رسمية للبطارية والشاحن والمستقبل وجهاز التحكم، لذلك تركناها:
| القطعة | ما فيها | السعر |
|---|---|---|
| طقم X500 V2 شبه الجاهز ARF | الهيكل وأربعة محركات 2216 KV920 وأربعة ESC بقدرة 20 أمبير والمراوح | 329 دولاراً |
| Pixhawk 6C مع PM02 | المتحكم في الطيران ووحدة الطاقة | 217.99 دولاراً |
| M10 GPS | ال GPS مع البوصلة | 43.99 دولاراً |
| المجموع دون البطارية والراديو | 590.98 دولاراً |
ولاحظ أن Holybro يعرض أيضاً طقماً كاملاً باسم PX4 Development Kit X500 v2 بسعر 609 دولارات، فقارن ما فيه بالقائمة قبل أن تشتري القطع منفصلة.
أخطاء شائعة
- اختيار المحرك من KV وحده: المحرك يقاس مع مروحته وجهده، فاختر من جدول الاختبار.
- طائرة تقف فوق 70% من الدفع: لا يبقى للمتحكم مجال للتصحيح، فخفف الوزن أو كبر المحركات والمراوح.
- اختبار المحركات والمراوح مركبة: PX4 وArduPilot وBetaflight كلها تقول انزعها أولاً.
- مروحة مقلوبة أو محرك بعكس اتجاهه: الطائرة تدور حول نفسها أو تنقلب لحظة الإقلاع، كما سوف ترى في التجربة.
- البوصلة قرب أسلاك الكهرباء: اتجاه خاطئ ودوران في دوائر عند الوقوف بال GPS.
- تخزين البطارية مشحونة بالكامل: خزنها بين 3.6 و3.9 فولت للخلية.
تدريب عملي
- شغل السكربت بوزن كلي 2800 جرام، وانظر هل تبقى الطائرة تحت حد 70%.
- أضف إلى السكربت جدول محرك آخر من صفحة شركته، واحسب نسبة الوقوف لطائرتك.
الخلاصة
- الكهرباء تذهب من البطارية إلى ال ESCs مباشرة، والمتحكم يأخذ 5 فولت وقراءة البطارية من وحدة الطاقة ويرسل إشارات رقمية فقط.
- اختر الهيكل والمروحة والمحرك معاً من جدول اختبار المحرك، واجعل الطائرة تقف قرب 50% من الدفع ولا تتجاوز 70%.
- المروحة الأكبر الأبطأ أكفأ بكثير بالجرام لكل واط، والطائرة الصغيرة السريعة تدفع الثمن في زمن الطيران.
- عدد الخلايا والسعة ومعامل C تحدد الجهد والطاقة والتيار، وال PX4 يحتاج أن تخبره بها.
- المراوح آخر ما تركبه، واتجاه كل محرك يجب أن يطابق الإطار الذي اخترته في البرنامج.
دليلالطائرات المسيرة للمبتدئين: كيف تطير ومم تتكونكيف تقف الطائرة المسيرة في الهواء وتميل وتدور بتغيير سرعة محركاتها فقط، ومم تتكون، وأي نوع يناسب أي عمل.
دليلPX4 وArduPilot أم DJI: أي منصة تناسب طائرتك؟ما الفرق بين منصات الطائرات المسيرة المفتوحة ومنصة DJI المغلقة ومكتباتها، وما القيود الأمريكية الرسمية التي تدخل في القرار اليوم.
دليلبرمجة الطائرات المسيرة مع PX4 وMAVSDKكيف تكتب برنامجاً يقلع بالطائرة المسيرة ويطير مهمة ويعود، وتختبره في محاكاة، وترى كيف يحميها الطيار الآلي عند الأعطال.
دليلROS 2 وPX4: كيف تطور برمجيات الطائرة المسيرةكيف تطور كود الطائرة المسيرة من المحاكاة إلى الحقل، وتربط ROS 2 بالطيار الآلي PX4، وتقرأ سجل الطيران عندما لا يطير كما توقعت.سجل التحديثات
- أكتوبر 2026: كتابة المقال دون تجميع طائرة حقيقية، والحسابات من جداول Holybro وT-Motor كما قرأناها في 12 أكتوبر 2026، والتجربة على PX4 v1.17.0 في محاكاة SITL مع Gazebo (jonasvautherin/px4-gazebo-headless:1.17.0) وPython 3.13.