# تطوير نظام بدائي يقوم باستخلاص المعلومات المخزنة في الصندوق الأسود الخاص بالطائرات



## م المصري (22 ديسمبر 2007)

بسم الله الرحمن الرحيم​ 
سيتم باستخدام أدوات التطوير المتوفرة في برامج الـ 3D لتطوير نظام بدائي يقوم باستخلاص المعلومات المخزنة في الصندوق الأسود الخاص بالطائرات للقيام بمحاكاة ثلاثية الأبعاد لحركة الطائرة إضافة للظروف المحيطة بها. 
سنعتمد لتنفيذ هذا المثال على بيئة التطوير المتوفرة في الـ *XSI* إضافة للـ *VB Script* كلغة برمجة بسيطة لأتمتة المهمات. بالطبع يمكننا بشكل مماثل تطبيق نفس المفاهيم في البرامج الأخرى مع مراعاة اختلاف لغات البرمجة المتوفرة فيها والتي قمنا باختيار الـ *XSI* من بينها بسبب اعتماده على لغات scripting نظامية ومتنوعة مثل الـ *VB Script* والـ *Jscript*. بينما لا يوفر أي من الـ *Maya* أو الـ *3Ds MAX* لغات برمجة معروفة لأتمتة المهمات حيث يعتمد كل منهم على اللغة الخاصة به (*MEL* في حال الـ *Maya* أوالـ *MAX Script* في حال الـ *3Ds MAX*). 
الآن بالنسبة للمعلومات المخزنة في الصندوق الأسود سنفترض أنها مخزنة بشكل رقمي بأي صيغة ملفات معروفة. ولسهولة التعامل سنفترض أنها مخزنة ضمن جداول في ملف *Excel*. 
لذلك وقبل البدء بتنفيذ المثال علينا الحصول على ملف *Excel* يحوي هذه المعلومات إما بافتراضها بشكل وهمي أو بتفجير طائرة واستخلاص الصندوق الأسود الخاص بها من أجل الحصول على معلومات واقعية... أمزح فقط. 
المهم سنقوم باستخدام ملف *Excel* وهمي يحوي معلومات افتراضية عن حركة الطائرة كالتالي: 
في العمود الأول سيكون لدينا الفواصل الزمنية المستخدمة في تسجيل معلومات الملاحة الجوية. في العمود الثاني الى الرابع سيتم تخزين إحداثيات الطائرة. بينما في العمود الخامس الى السابع يمكننا إضافة أي معلومات خاصة مثل معلومات عن محركات الطائرة. ​ 





​ 
الآن بعد أن أصبحت المعلومات الخاصة بالطائرة جاهزة يمكننا البدء ببناء النظام المطلوب في الـ *XSI*. 
الفكرة العامة لهذا النظام بسيطة جداً... كل ما يجب فعله هو جعل الـ *XSI* يقرء جميع القيم المتوفرة في ملف الـ *Excel* وتطبيقها على نموذج الطائرة المجسم الوجود في البرنامج بالاعتماد على الفواصل الزمنية المفروضة ثم بعد ذلك يمكننا اضافة أية خوارزميات إضافية عن الظروف الجوية المحيطة بالطائرة بالاعتماد على تطبيق معادلات هيدروليكية ولكن بشكلها العكسي وذلك على افتراض أن حركة الطائرة تتم ضمن وسط هيدروليكي وهو الهواء. 
سأبدأ فوراً بكتابة الـ code في *Visual Studio* مع التعليق على الكتل البرمجية المختلفة ولكن دون الخوض بالتفاصيل البرمجية وذلك بسبب بساطة كل من الفكرة واللغة بحد ذاتها. ​ 




​ 
بدايةً سنقوم بإنشاء مشهد جديد والحصول على النموذج المجسم للطائرة: ​‘// start freshNewSceneSetDisplayMode "Camera", "shaded"‘// Create a light to illuminate the sceneGetPrimLight "Point.Preset", "Point"Translate , .8, 13, 18‘// Create a plane objectCreatePrim "Cube", "MeshSurface", "Airplane"​سنقوم هنا بربط ملف code إضافي *"ExcelUpdate"* وظيفته تحديث معلومات الطائرة ضمن الفواصل الزمنية المختلفة واستنتاج أي معلومات إضافية: ​‘// set a script to run on each frame changeSetValue "PlayControl.OnFrameChangeCommand", "ExcelUpdate"​هنا يمكننا بناء نظام إظهار النتائج الخاص بالطائرة: ​‘// create a textual overlayCreateMeshText "CurveListToPlanarMeshForText",siPersistentOperation' set it to emptySetValue "text.text.text", "_RTF_{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Arial;}}" & vbCrLf & "\viewkind4\uc1\pard\lang1033\fs20\par" & vbCrLf & "}" & vbCrLf & ""‘// set it to ignore lighting changesApplyShader "Material\Constant"‘// set the colorSetValue "polymsh.Material.Constant.color.green", 0SetValue "polymsh.Material.Constant.color.blue", 0SetValue "polymsh.Material.Constant.color.red", 1‘// position itScale , .1747,.1747,.1747, siAbsolute, siLocalCOG, siObj, siXYZTranslate , -2.0698, -1.5466, 12.5455, siAbsolute, siGlobalCOG, siObj, siXYZ‘// connect it to the camera so it acts like a titleSetUserPref "SI3D_CONSTRAINT_COMPENSATION_MODE", 1ApplyCns "Pose", "polymsh", "Camera", TrueSetUserPref "SI3D_CONSTRAINT_COMPENSATION_MODE", 0DeselectAll​الآن يمكننا البدء بفتح ملف الـ Excel ومعالجة محتوياته على الشكل التالي: ​
فتح نسخة (instance) من برنامج الـ *Excel:* ​‘// Open Excel application instance…dim dataset data = createobject("excel.application")​
فتح جدول معلومات الطائرة: ​‘// Open the spreadsheetdata.workbooks.open("c:\blackboxdata.xls")​
البحث عن بداية الأعمدة التي تحوي المعلومات: ​Columns where we find informationDataStartRow = 6timeColumn = "a"xColumn = "b"yColumn = "c"zColumn = "d"rColumn = "e"gColumn = "f"bColumn = "g"​
على عدد الكوادر (Frames) المطلوبة اعتماداً على الفواصل الزمنية في الملف: ​‘// Got to the start of the animationFirstFrame‘// get the number of frames of animation in the spreadsheetExcelFrameCount = data.range("B2")​
كل كادر في الـ *XSI* بمعلومات الصف المقابل له في الـ *Excel*: ​For i = 1 to ExcelFrameCount ' map the current frame number to a row in Excel FrameNumber = i + DataStartRow - 1 xpos = data.range(xColumn & FrameNumber) ypos = data.range(yColumn & FrameNumber) zpos = data.range(zColumn & FrameNumber) translate "Airplane", xpos, ypos, zpos, siAbsolute, siGlobal SaveKey "Airplane.kine.local.posx, Airplane.kine.local.posy, Airplane.kine.local.posz", i redChannel = data.range( rColumn & FrameNumber) greenChannel = data.range( gColumn & FrameNumber) blueChannel = data.range( bColumn & FrameNumber) SetKey "Airplane.Material.Constant.color.red", i, redChannel SetKey "Airplane.Material.Constant.color.green", i, greenChannel SetKey "Airplane.Material.Constant.color.blue", i, blueChannelnext' close exceldata.quit' update the viewportSetValue "PlayControl.Current", 2PrevFrame​
بعد الانتهاء من قراءة المعلومات من ملف الـ *Excel* ومحاكاة مسار حركة الطائرة في الـ *XSI* يمكننا الآن من إضافة أي خوارزميات في ملف الـ *"ExcelUpdate"* لحساب واستنتاج أي معلومات إضافية عن الظروف المحيطة بالطائرة. 
لذلك سأقوم الآن في الـ *Visual Studio* بانشاء ملف *vbs* جديد باسم *"ExcelUpdate"* ولكنني لن أقوم هنا باستنتاج وبرمجة أية خوارزميات معقدة لأن هذا سيحتاج إلى مساحة أوسع من مجرد وريقات لشرح الأفكار الهيدروليكية ومن ثم تطبيقها في البرنامج. لذلك سأكتفي باستنتاج وتخريج معلومات وهمية يمكنك استبدالها بما تريد. ​Altitude = GetValue("Airplane.kine.local.posy", currentFrame)SetValue "text.text.text", "_RTF_{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Arial;}}" & vbCrLf & "\viewkind4\uc1\pard\lang1033\fs20 Altitude " & Altitude & "\par" & vbCrLf & "}" & vbCrLf & ""​حسناً... يمكننا الآن اختبار هذا النظام الصغير في الـ *XSI* والاستمتاع بنتائج المحاكاة التي سنحصل عليها. ​ 




​ 
للحصول على المزيد من المتعة يمكنك إضافة *Rigid Bodies Simulation* أو (محاكاة الأجسام الصلدة) للطائرة بعد تحديد جميع الخصائص الفيزيائية للطائرة اعتماداً على المعلومات المستنتجة للحصول على نظام متكامل لمحاكاة حركة الطائرة لحظة تحطمها بشكل دقيق. 
بالطبع لا تتوقع أن تحصل على نتائج واقعية وذلك بسبب عدم دقة المعلومات المفترضة في البداية إضافة الى وجود عدد كبير من العوامل الهامة التي أهملناها في حساباتنا لسهولة العرض والتي تؤثر بشكل كبير على نتائج المحاكاة. 
ولكن ما يهمنا من الموضوع في النهاية هو آلية العمل للنظام ككل الذي يمتلك مرونة التحسين والإضافة بالشكل الذي نراه مناسباً. ​ 
الآن وبعد أن انتهينا من تجريب هذا المثال أتمنى أن تكون فكرة استثمار الأمكانيات المختلفة في برامج الـ 3D التي بين أيدينا قد أصبحت ملموسة بحيث تكون خيارنا الأول في المجالات العلمية إضافة بالطبع إلى المجالات الفنية أو الترفيهية المعهودة. 
لاشك أن المثال المطروح خيالي بعض الشيء وكنت أتمنى أن أطرح أمثلة وأبحاث أخرى أكثر واقعية وإمكانية للتطبيق الفعلي ولكن أي منها يحتاج الى المزيد من الحيز الورقي الذي لا أعتقد أنه متوفر في حالتنا هنا. 
أخيراً بعض المراجع العلمية الهامة للمهتمين بمثل هذه الأمور... ​Advanced Animation & Rendering Techniques: Theory and Practice. By: Alan Watt & Mark WattApplied Mathematical Science: Level Set Methods & Dynamic Implicit Surfaces. By: Stanley Osher & Ronlad Fedkiw​
لمراسلة كاتب المقال لمزيد من المعلومات هذا الرابط:http://www.instructurez.com/papers/research.htm​


----------



## اكديد (24 ديسمبر 2007)

موضوع رائع...
جزاك الله خيرا...


----------



## م المصري (28 ديسمبر 2007)

مرور اروع ... أخي راكيد


----------

