للقراء الأعزاء في GeekTimes ، المقال التالي (الرابع)
الذي طال انتظاره حول ما سيحدث إذا قمت بخلط اردوينو ، ESP8266 ، WI-FI مرة أخرى ، وقم بتجميعه بهاتف ذكي يعمل بنظام Android ورشه على أعلى تطبيق JAVA.
سنتحدث عن الروبوتات من
المقال قبل الأخير ، والذي حان الوقت لنصبح أكثر ذكاءً على الأقل.

من يهتم ، مرحبا بكم في القط.
إذا لم تكن مهتمًا جدًا بقراءة المقالات القديمة ، فبإيجاز - تمت السيطرة على العربة ذات العجلات الأربع المعتادة على منصة Arduino ، وتم إضافة جسر UART لاسلكي طورته لي استنادًا إلى وحدة ESP8266 المعروفة. أيضًا من أجل الراحة (وبشكل عام كان هذا هو الهدف الرئيسي) باستخدام نفس ESP ، كتبت مبرمجًا لـ arduinki ، مما يسمح لك بتحريكه بنفسك عن بُعد.

أي أن العربة في مكان ما (ولكن داخل شبكة WI-FI الخاصة بك) تنتقل (نعم ، أود أن أكتب هذه الكلمة) ، وترسل البيانات وتتلقى الأوامر ، وإذا لزم الأمر ، يمكن أيضًا تغيير البرنامج في متحكم AVR. وفقًا لذلك ، تم تشغيل البرنامج على JAVA للكمبيوتر ، حيث يمكنك الاستمتاع بالتحكم والحصول على القياس عن بُعد البدائي في شكل المسافة المقطوعة (مفتاح القصب والمغناطيس على العجلة).

علاوة على ذلك ، لقد نجحت في
المقالة التالية بتجربة التحكم في العربة باستخدام الهاتف الذكي - الأزرار والإمالة وحتى الصوت. لكن عندما غادرت العربة الغرفة التالية ، لم يستطع الصوت إعادتها (على عكس القط). ذهبت إلى هناك ، وطرقت على الجدران والأثاث ، وحصلت على شباك الأسلاك ، ولكن إلى جانب المعلومات حول المسافة المقطوعة ، لم ترسل أي شيء.
لذلك ، على الفور نشأت الفكرة لتزويد المنهي في المستقبل بالأعضاء الحسية. واحدة من أسهل الخيارات لهذا هو استخدام السونار.

خوارزمية العمل على الخزي بسيطة ، حيث نبدأ تشغيل المستشعر من جهة واحدة وفي نفس الوقت من عداد المتحكم الدقيق. HC-SR04 يبدأ رصاصة الموجات فوق الصوتية في المسافة. تشير إشارة الاستجابة من المستشعر عبر سلك آخر إلى نهاية قياس المسافة ، والفاصل الزمني بين البداية والاستجابة يتناسب مع المسافة المقاسة. وفقًا لذلك ، في هذه اللحظة نقوم بإبطاء العداد ونرى مقدار ما جاء فيه.
يتم الحصول على دقة تصل إلى حوالي سنتيمتر واحد ، ومجموعة من متر إلى اثنين. إنه لا يحب الأسطح الصوفية والصوفية (على سبيل المثال ، قطة) ، حيث يغرق أي إشارات صدى لا رجعة فيها.
المنطقة المصابة تكون زاوية المشاهدة في HC-SR04 صغيرة ، لذا لمعرفة ما يحدث في المستقبل بزاوية لا تقل عن 90 درجة ، من المستحسن القيام بما يلي:
- قم بربط المستشعر بالآلة المؤازرة وابحثها في اتجاهات مختلفة
- وضع بعض أجهزة الاستشعار.
في البداية ، قمت بتنفيذ الخيار الأول ، بوضع السونار على جهاز SG90 مؤازر رخيص وتحولت العربة إلى سيارة روفر. كان يلزم الكثير من الوقت لأخذ ثلاثة قياسات على الأقل ، لذلك كانت العربة في الأساس تدور مع مؤازرة ، ثم تحركت بعناية للأمام ، ولكن ليس بعيدًا (وفجأة ظهرت عقبة على الجانب) ، وشعرت مرة أخرى بالمساحة أمامها. ومع ذلك ، فإن الصوت ليس هو ضوء لك.
لذلك ، دون مزيد من اللغط ، وضعت ثلاثة أنظمة السونار على ذلك في وقت واحد. اكتسبت العربة مظهر العنكبوت الكاثوني ، وتوقفت عن العمل أمام العقبات ، وبدأت في تاكسيها أثناء التنقل. لكن العقول في النهاية كانت كافية فقط حتى لا تتعثر في بيئة ودية. كان علينا أن ننتقل إلى الحكم الذاتي والتقدم. وهنا ، بدون حواس مختلفة ، حتى دودة النيماتودا ستخبرك ، لا يمكنك القيام بذلك.
علاوة على ذلك ، يبدأ المتحمسون عادة بالنحت على إبداعاتهم بمختلف أجهزة الاستشعار الجديدة ، مثل أجهزة قياس الجيروسكوب - مقياس التسارع - المغنطيسية وحتى أجهزة استشعار FIRE (كل ما ينتجه الصينيون المجهولون بملايين الكميات لأردوينو). وأنا أيضًا بدأت تقريبًا على طول هذا المسار الزلق ، لكني غيرت رأيي في الوقت المناسب. وفعلت هذا لهذا السبب. في أبعد منظور ، كان من المفترض أن يحصل الروبوت الآلي على رؤية في شكل كاميرا ويفهم أيضًا ما يراه. لكن متحكم AVR من لوحة Arduino سيقول لك "وداعًا" في مرحلة استلام الفيديو ، ناهيك عن معالجته. وفجأة سقطت نظري على الهاتف الذكي المسن GALAXY S7 ، الذي أصابته الحياة بالفعل.
هذه القوة الحاسوبية ، ثمانية النوى ، 4 غيغابايت من الذاكرة ، واثنين من الكاميرات ، والوصول إلى الشبكة ، ما هو المطلوب لتحويل القرد إلى شخص؟
لكننا نحتاج فقط إلى تصميم صغير حتى يستقر هاتفنا الذكي على عربة ويمكن وضعه وإزالته بسهولة.

ثم صعدت إلى موقع مطوري Android للتعرف على الميزات الأخرى التي يمكن أن يوفرها لنا الهاتف الذكي العادي. اتضح أن ليست صغيرة. من الناحية النظرية ، يمكنك ذلك
الوصول إلى أجهزة استشعار الاستشعار التالية.TYPE_ACCELEROMETER
TYPE_AMBIENT_TEMPERATURE
TYPE_GAME_ROTATION_VECTOR
GEOMAGNETIC_ROTATION_VECTOR
TYPE_GRAVITY
TYPE_GYROSCOPE
TYPE_GYROSCOPE_UNCALIBRATED
TYPE_HEART_BEAT
TYPE_HEART_RATE
TYPE_LIGHT
TYPE_LINEAR_ACCELERATION
TYPE_LOW_LATENCY_OFFBODY_DETECT
TYPE_MAGNETIC_FIELD
TYPE_MAGNETIC_FIELD_UNCALIBRATED
TYPE_MOTION_DETECT
TYPE_ORIENTATION
TYPE_POSE_6DOF
TYPE_PRESSURE
TYPE_PROXIMITY
TYPE_RELATIVE_HUMIDITY
TYPE_ROTATION_VECTOR
TYPE_SIGNIFICANT_MOTION
TYPE_STATIONARY_DETECT
TYPE_STEP_COUNTER
TYPE_STEP_DETECTOR
كما يقولون ، ما هناك فقط! وبالفعل ، لم يكن هناك الكثير مما كان محددًا لجهاز GALAXY S7. على سبيل المثال ، جهاز استشعار الرطوبة. ودرجة الحرارة المحيطة (على الرغم من أنني فهمت أن التواجد داخل العلبة ، سيظهر درجة حرارة الهاتف الذكي نفسه). لكن أجهزة استشعار الضغط والضوء كانت موجودة. ناهيك عن الجيروسكوبات ومقاييس التسارع التي تستخدمها ، يمكنك بسهولة تحديد موقعك في الفضاء.
ونتيجة لذلك ، نضجت قرارًا ، ودع الهاتف الذكي يتلقى ويعالج جميع معلومات المستوى الأعلى - الفيديو وجميع هذه المستشعرات المختلفة. وستكون منصة Arduino مسؤولة ، إذا جاز التعبير ، عن اللاوعي - عن كل شيء يعمل بالفعل ولا يتطلب إعادة صياغة ، كل هذه المحركات ، السونار ، مفاتيح القصب وما إلى ذلك.
نظرًا لأنه من الصعب تصحيح البرنامج مباشرة على الهاتف الذكي ، حتى مع UDB ، قررت أن يتم نقل كل شيء إلى كمبيوتر شخصي عادي ومعالجته هناك. وبعد ذلك بطريقة أو بأخرى ، عندما تكون هناك نسخة صالحة للعمل ، سنعيد العقول مرة أخرى إلى العربة. يجب أن نبدأ صغيرًا ، ومن الممتع حقًا أن ننظر إلى نقل الفيديو من عربة محمومة.
يمكن إرسال البيانات من أجهزة الاستشعار في خط بسيط ، من خلال خادم عميل بدائي ، لا توجد مشاكل مع هذا على الإطلاق. ولكن مع نقل الفيديو ، كانت هناك على الفور صعوبات. بشكل عام ، كنت بحاجة إلى بث مباشر في الوقت الفعلي من كاميرا الهاتف الذكي إلى نافذة التطبيق على الكمبيوتر. هذا الان في المستقبل ، ليس أنا فقط ، ولكن نوعًا من نظام التعرف على الأنماط يمكن أن يحدق في هذه الصورة في النافذة. على سبيل المثال JAVA OpenCV. أو ربما حتى شبكة عصبية من السحابة: D. لا أعرف ، هذه المرحلة لا تزال بعيدة جدًا. لكنني أود أن أرى العالم "عين" شاحنة آلية.
يعلم الجميع حول العديد من التطبيقات مثل "كاميرا محمولة" من متجر Google ، حيث يمكنك التقاط دفق فيديو من كاميرا الهاتف الذكي عن طريق فتح متصفح به عنوان IP المرغوب على الكمبيوتر. لذلك ، في البداية اعتقدت أنه سيكون من السهل تنفيذ البث من GALAXY بنفسي (والذي كان خطأً جيدًا) ، لذا عليك أولاً التحقق من مدى استقباله على جهاز الكمبيوتر ، نظرًا لأنني لا أستطيع الكتابة بطريقة أو بأخرى إلا على JAVA.
كما اتضح ، مع تشغيل الفيديو JAVA ، بعبارة ملطفة ، وليس بشكل جيد للغاية. ذات مرة في عام 1997 ، تم إصدار ما يسمى Java Media Framework - مكتبة تسهل تطوير البرامج التي تعمل مع الصوت والفيديو من المبدعين من JAVA أنفسهم. ولكن ، في مكان ما بعد عام 2003 ، تم وضع صاعقة كبيرة عليه ، ومنذ ذلك الحين كان بالفعل 15 عامًا. بعد بعض التجارب ، تمكنت من تشغيل ملف واحد في النافذة ، لا أتذكر أي ملف بالفعل (يبدو أنه AVI) ، لكن هذا المنظر بدا تعيسًا. لا تريد الملفات ذات الملحقات الأخرى أن تعمل على الإطلاق ، في الحالات القصوى كان هناك مسار صوتي واحد.
على الإنترنت ، وجدت مشروعين بديلين آخرين للعمل مع الفيديو: Xuggler و aprica VLCj. كان المشروع الأول جذابًا في قدراته ، لكنه توفي أيضًا منذ فترة طويلة ، لكن المشروع الثاني كان مفعمًا بالحيوية وممتعًا في فكرته. استغرق الرجال وتثبيتها إلى JAVA مشغل الوسائط VLC الشهير. أي أن aprica لا تستخدم برامج الترميز المكتوبة ذاتيا ، ولكنها تستخدم برامج الترميز الجاهزة. مع ذلك ، سوف تفقد أي ملف. قرار حكيم ، ولكن الشيء الرئيسي هو أن لديك بالفعل مشغل VLC مثبتًا على جهاز الكمبيوتر الخاص بك. حسنًا ، من ليس لديه هذا؟ التحذير الوحيد ، مع ذلك ، هو أن لديك نفس أعماق المشغل و JAVA. على سبيل المثال ، اكتشفت في وقت لاحق أنه لا يزال لديّ 32 VLC على جهاز الكمبيوتر الخاص بي ، على عكس JAVA 64 بت. وفقد نصف يوم من الحياة سدى.
يعد مطورو Caprica المستخدمين بالكثير من الأشياء على موقعهم على الويب. وجميع تنسيقات الملفات وتشغيلها في العديد من النوافذ في تطبيق JAVA ، وتشغيل الفيديو من You-Tube ، والتقاط دفق الفيديو "المباشر" ، وهلم جرا. لكن الواقع القاسي وضع كل شيء في مكانه. لا ، لم يخدعوا مع الملفات - لعبت كل شيء. لكن الآن لم يعد الفيديو من YouTube مطلوبًا. في البداية لم أستطع أن أفهم السبب ، ولكن بعد ذلك رأيت نقشًا في السجل بطريقة ما ، في مكان ما ، كان من المستحيل تشغيل برنامج نصي معيّن للتذكير ولاحظ على الفور ما يلي:
يعد "مسح الشاشة" لصفحة YouTube على الويب هشًا - إذا غيّر YouTube بنية صفحات الويب الخاصة به ، فسوف يفشل VLC أحيانًا في العثور على عنوان URL المتدفق ، وعندما يحدث هذا عليك الانتظار حتى يقدم مطور برامج LUA جديدة النصي وانتظر إصدار جديد من VLC ليتم إصدارها.
باختصار ، يبدو أن YouTube قد غيّر هيكل صفحته على الويب وأحتاج إلى انتظار إصدار جديد. من ناحية أخرى ، أحتاج إلى بث فيديو "مباشر" ، وعدم تشغيل ملف من الموقع. هذا ، حتى لو نجح النص lua ، فلن يساعدني كثيرًا.
لكنني لم أجد التدفق الموعود على الإطلاق ، على الرغم من أنه كتب ما يلي:
خادم بث الشبكة (مثل محطة راديو الشبكة أو فيديو على خادم الطلب) ؛
دفق شبكة العميل ؛
ربما تكون قائمة الأمنيات ، أو ربما تكون في الإصدار التجاري ، من الصعب القول.
لكن الملفات لعبت ، وأكرر ، دون أي شكاوى. على سبيل المثال ، يمكنك إنشاء ، وهنا هو غير لائقة
تثبيت الحزمة نفسها ليس صعبًا ، بل إنه موصوف بالتفصيل ، على سبيل المثال ،
هنا . صحيح ، لقد وصفت متغيرات البيئة بطريقة خرقاء ، والآن يبدأ VLC الخاص بي لأول مرة مع تأخير لمدة عشر ثوانٍ ، لكن بعد ذلك يحفظ ما هو مطلوب في ذاكرة التخزين المؤقت ثم يبدأ في الجلسة الحالية لاحقًا بدون توقف مؤقتًا.
ثم في مشروع JAVA الخاص بك ، يمكنك تحديد التبعيات اللازمة ويمكنك البدء في
تثبيت مشغلات الوسائط في نوافذ JAVA للعمل.
بعد أن وضعت علامة على خطة العمل التقريبية على جانب الكمبيوتر الشخصي ، عدت إلى مصدر بيانات الفيديو ، الهاتف الذكي ANDROID الخاص بي.
ولكن هنا كنت أتوقع خيبة أمل كبيرة أخرى إلى حد ما. بعد مسح عدد غير قليل من المواقع وحتى دليل ANDROID عبر الإنترنت ، وجدت أنه من المستحيل تنظيم البث في الوقت الفعلي باستخدام الوسائل العادية. كما في Caprica ، يمكنك فقط قراءة الملفات المسجلة بالفعل. أي أن الكاميرا قيد التشغيل ، بدأت MEDIA RECORDER بالتسجيل عند الحاجة إلى إيقافها. ولا يمكننا الوصول إلى البيانات (ونقلها) إلا بعد توقف.
لقد وجدت تأكيدًا لاستنتاجاتي في
مقال قديم. كانت هناك بالفعل تلميحات بأنه بمجرد أن يتمكن شخص ما من خداع أندرويد ليعتقد أنه كان يكتب إلى ملف ، لكن في الواقع قاموا بتخفيض المخزن المؤقت. ولكن على أي حال ، كما سبق شرحه مسبقًا ، لم أتمكن من التقاط دفق الفيديو هذا على جانب الكمبيوتر الشخصي في تطبيق JAVA.
لذلك ، تم اتخاذ قرار بسيط ، بلوط ،
مؤقت (أريد التأكيد) - لإرسال دفق فيديو من الكاميرا إلى أجزاء لمدة ثانيتين. ليس روفر ، بطبيعة الحال ، ولكن روفر بالفعل تبين تماما.
بعد أن توصلت إلى هذا القرار ، بدأت أتقن فصول CAMERA و MEDIA RECORDER. يوجد عدد قليل من أمثلة التعليمات البرمجية على الشبكة لإطلاق الكاميرا وتسجيل ملفات الفيديو ، لكن لسبب ما لم يعمل أي منهم معي. لا على المحاكي ، ولا على جهاز حقيقي. اتضح أن السبب يكمن في الأذونات ، أي في الأذونات. اتضح أن أمثلة التعليمات البرمجية كانت مكتوبة في تلك الأيام التي كان فيها Android مجانيًا ويمكن للمبرمج القيام بكل ما يريد إذا كتب جميع الأذونات اللازمة في البيان. لكن الإصدار الحالي من OC لم يسمح بذلك. أولاً ، كان عليك منح المستخدم إذنًا لكتابة الملف وتشغيل الكاميرا فور بدء التطبيق. كلفني ذلك نشاطًا إضافيًا ، أي في النشاط.
فئة MainActivity.javaimport android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.hardware.Camera; import android.media.MediaRecorder; import android.os.AsyncTask; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; import java.io.File; public class MainActivity extends AppCompatActivity { Camera camera; MediaRecorder mediaRecorder; public static MainActivity m; public static boolean Camera_granted; File videoFile; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if ((ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) ||(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) )
بعد ذلك ، سارت الأمور بسلاسة وظهر رمز العمل التالي. النشاط الثاني لفئة Camera_Activity مسؤول عن العمل مع الكاميرا وتسجيل ملفات الفيديو. فئة Http_server لإعادة التوجيه (الاسم ، بالطبع ، غير صحيح ، لكنه اتضح تاريخيًا) الرمز بسيط ، أينما كان هناك تفسير.

كل شيء يكذب تماما على جيثب.
الارتباط .
Camera_Activity import android.hardware.Camera; import android.media.MediaRecorder; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.ServerSocket; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.content.Context; import android.hardware.Sensor; import static android.hardware.Camera.getNumberOfCameras; import java.io.BufferedOutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; public class CameraActivity extends AppCompatActivity implements SensorEventListener { SurfaceView surfaceView; TextView mTextView; Button mStart; Button mStop; Camera camera; MediaRecorder mediaRecorder; public static ServerSocket ss; public static ServerSocket ss2; public static MainActivity m; public static volatile boolean stopCamera=true; public static int count=1; public static File videoFile1; public static File videoFile2; public static File videoFile3; public static volatile byte[] data; public SensorManager mSensorManager; public Sensor mAxeleration, mLight,mRotation,mHumidity,mPressure,mTemperature; public int ax; public int ay; public int az; public double light; public int x; public int y; public int z; public double hum; public double press; public double tempr; public static String Sensors; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
جوهر البرنامج بعد بدء تشغيل الكاميرا وتشغيلها هو كما يلي:
اكتب فيديو لمدة ثانيتين إلى الملف الأول ،
نكتب الفيديو لمدة ثانيتين إلى الملف الثاني ، وفي الوقت نفسه نرسل الملف الأول عبر TCP-IP عبر WI-FI المحلي إلى الكمبيوتر ،
اكتب الملف الأول مرة أخرى ، وفي الوقت نفسه أرسل الملف الثاني ،
و هكذا.
ثم تتكرر الدورة حتى يتم الضغط على زر "التوقف" أو نفاد بطارية الهاتف الذكي. من حيث المبدأ ، من الممكن تطبيق تناظر أزرار الضغط ، باستخدام أوامر من جهاز كمبيوتر ، وكذلك عبر TCP ، وهذا ليس بالأمر الصعب.
في البداية ، يتكون المخزن المؤقت للفيديو ، في حالة وجوده ، من ثلاثة ملفات بتنسيق 3GP (نكتب الأول ، نرسل الآخر ، نكتب الثاني ، نرسل الأول ، نكتب الثاني ، نرسل الثاني) ، لكن اتضح بعد ذلك أن الملفين يكفيان (تسجيل وإرسال بعضنا البعض لا تتدخل).
بفضل دقة الكاميرا التي تبلغ 640 × 480 ، يتم الحصول على الملفات ، في مكان ما يتراوح بين 200 و 300 كيلو بايت ، وهو أمر صعب للغاية بالنسبة لجهاز التوجيه الخاص بي. لم أكن أزعج الصوت بعد ، لكن يبدو أن كل شيء بسيط هناك: تقوم بتثبيت برامج التشفير الصوتية ومعدل البت وعدد القنوات وما شابه ذلك.
بعد ذلك بقليل ، عندما قمت بتصحيح عملية نقل الفيديو ، قمت بإضافة الرمز أيضًا بنقل المعلومات من أجهزة استشعار الهاتف الذكي. يتم نقل كل شيء بشكل تافه في سطر واحد ، لكن لا يمكنني نقله عبر نفس المقبس مثل الفيديو. على ما يبدو ، تستخدم فئات إرسال سلسلة PrintWriter ونقل البيانات الثنائية BufferedOutputStream تدفقات مختلفة ، ولكن بعد ذلك تحتوي على مخزن مؤقت للإخراج واحد ، حيث يفسد كل منهما الآخر بنجاح. نتيجة لذلك ، يبدأ الفيديو في خلل وتنهار. بالإضافة إلى ذلك ، يتم إرسال ملف الفيديو مرة واحدة كل ثانيتين ، وبالنسبة لأجهزة الاستشعار هذه الفترة الزمنية كبيرة جدًا. لذلك ، تقرر توزيعها في مآخذ مختلفة حتى لا تتداخل مع بعضها البعض. لهذا السبب ، ظهرت فئة جديدة Http_server_Sensors.
لذلك ، قمنا بتنظيم الإرسال ، والآن مرة أخرى سنعود إلى الجانب المظلم المتلقي.
كما رأينا بالفعل من المثال الأول ، فإن تشغيل ملفات الفيديو في تطبيق JAVA باستخدام مشغل VLC لا يمثل أي مشكلة. الشيء الرئيسي هو الحصول على هذه الملفات.
البرنامج التجريبي التالي هو المسؤول عن هذا.
مشغل فيديو import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SwingUtilities; import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent; import uk.co.caprica.vlcj.discovery.NativeDiscovery; import uk.co.caprica.vlcj.player.MediaPlayer; import uk.co.caprica.vlcj.player.MediaPlayerEventAdapter; import java.io.*; import java.net.Socket; public class VideoPlayer { public final JFrame frame; public static EmbeddedMediaPlayerComponent mediaPlayerComponent; public final JButton pauseButton; public final JButton rewindButton; public final JButton skipButton; public static String mr1, mr2; public static boolean playing_finished = false; public static boolean File_1_play_starting = false; public static boolean File_1_play_finished = false; public static boolean File_2_play_starting = false; public static boolean File_2_play_finished = false;
جوهرها بسيط. يتم إطلاق عميل TCP ، والذي يبدأ في انتظار أن يكون الخادم جاهزًا على الهاتف الذكي. بعد استلام الملف الأول ، يبدأ التشغيل فورًا ويتوقع أن يكون الملف رقم 2 بالتوازي. علاوة على ذلك ، من المتوقع إما نهاية استقبال الملف الثاني ، أو نهاية تشغيل الأول. أفضل للجميع ، بالطبع ،
ثلاث نجوم ، عندما يتم تنزيل الملف بشكل أسرع من التشغيل. إذا فقدت الملف الأول ، لكنك لم تستلم الملف الثاني بعد ، فكل شيء ينتظر ... سنقوم بعرض شاشة سوداء. إذا لم يكن الأمر كذلك ، فابدأ تشغيل الملف الثاني بسرعة وقم بتنزيل الملف مرة أخرى في وقت واحد.
كان لدي أمل غامض في أن يكون التوقف بين تبديل ملفات التشغيل أقل من وقت رد فعل العين البشرية ، لكنه لم يتحقق. على مهل ، بالطبع ، هذا VLC.
نتيجة لذلك ، حصلنا على نوع من مقاطع الفيديو الدنيئة المتقطعة (أول تريبلوبيت ، على ما يبدو ، شاهد العالم مثل هذا) ، حيث يحدث ضبط الحدة باستمرار. ويجب أن نأخذ في الاعتبار أن الفيديو متأخر أيضًا لمدة ثانيتين. باختصار ، في الإنتاج لا أوصي بنشره. ولكن لدي نقص في السمك و trilobite ، كما يقولون ...
بإيجاز ما ذكر أعلاه ، يمكننا أن نقول على الإطلاق:
يعد إرسال مقاطع الفيديو غير فعال بشكل أساسي ويمكن أن يكون مفيدًا فقط في الحالات التي يكون فيها الفيديو طويلًا بما فيه الكفاية ولا تحتاج إلى رد فعل ثانٍ لما يحدث.
يعد نقل الفيديو عبر TCP-IP أيضًا فكرة غير صحيحة ، بغض النظر عن بعض الشخصيات على Habr التي يمكن أن يقولها حول سرعة نقل البيانات باستخدام هذا البروتوكول (الذي يفترض أنه أسرع من UDP). بطبيعة الحال ، تتمتع الإنترانت اللاسلكية الحديثة بخصائص جيدة لتوفير مصافحة مستمرة لخوادم TCP وعملائها ، ويبدو أن TCP نفسه قد تمت ترقيته للحصول على بيانات طويلة ، ولكن لا تزال المقابس بين التركيز على تشغيل الفيديو ، كما تظهر في العرض التوضيحي ، تظهر بشكل دوري.
ولكن ، على الأقل بالنسبة للمستقبل ، ظهرت الأفكار التالية:
- إرسال كل إطار على حدة (وليس الفيديو ، ولكن الصور) عبر UDP ، ولكن التحكم في المعلومات عبر TCP ،
- قم بتحريك إطارات الصور كل ذلك عبر UDP ولكن مع إشارات المزامنة في نفس القناة.
بالطبع ، حتى الآن هناك أسئلة أكثر من الإجابات. هل هناك سرعة استقبال كافية في JAVA بمستوى تجريدها في العمل مع الشبكة والصور؟ هل من الممكن القيام بـ 30 لقطة طبيعية في الثانية على المستوى المتاح لي في Android؟ هل سيتعين علي جنيها قبل إرسالها لتقليل معدل البت؟ ثم هل JAVA كافية للتعبئة والتفريغ؟ وإذا ، فجأة ، حدث شيء ما ، فهل سيكون من الممكن الانتقال إلى الخطوة التالية ، لفك نظام رؤية الكمبيوتر JAVA OpenCV هنا؟ بالطبع ، من المثير للاهتمام دائمًا مشاهدة الفيديو المتدفق من مستوى الأرض ، لكن يجب ألا ننسى الهدف الأعلى - روبوت آلي بذكاء نملة!
ولكن ، مع امتلاك ما لدينا ، سنعود إلى العربة الحالية. لم يتغير البرنامج القديم من المقال السابق لآخر متحكم AVR على منصة Arduino كثيرًا ، فقد تمت إضافة خيار التفريع فقط - القيادة المستقلة أو التحكم بواسطة المشغل. البيانات التي تنقلها العربة (الحبل الشوكي) عبر شبكة WIFI هي نفسها - المسافة المقطوعة. بعد ذلك بقليل ، أرفقت أيضًا نقل درجة حرارة عنصر حاسم - سائق المحرك. يتم إرسال كل هذا واستلامه أولاً بواسطة UART ، وبالفعل عند دخول الشبكة عبر UDP. لا أعطي الشفرة ، كل التحليل الكامل في
المقال قبل الأخير
.
بالنسبة للمحركين ، لا يزال (السائق) أكثر أو أقل بما يكفي ، ولكن مع أربعة بعد فترة من الوقت يسخن إلى حالة غير صالحة للعمل. في البداية حاولت استخدام أبسط أجهزة استشعار درجة الحرارة التناظرية على أساس الثنائيات زينر ، مثل LM335 ، ولكن لا شيء جاء منه. لم يكن لدي مصدر للجهد المرجعي ، لفترة قصيرة ، ION.
واصطياد الملوليت على بطارية منخفضة لا معنى له. بالمناسبة ، حول البطارية - عندما سئمت من إزالة وإعادة تركيب 14500 بطارية ليثيوم من أجل إعادة الشحن ، أخذت للتو بطارية احتياطية من مفك البراغي وبدأت العربة في القيادة لمدة ساعة ونصف ، بالإضافة إلى أنها حصلت على مظهر ووزن خطير (نعم ، هذه البطارية "عيون"). لذلك ، لقياس درجة الحرارة ، قمت بتركيب مقياس تسارع جيروسكوب خلل يعتمد على L3G4200D. لحسن الحظ ، قام أيضًا بقياس درجة الحرارة ونقلها عبر حافلة I2C.يقوم الهاتف الذكي الذي يجلس خلف البطارية وعلى عيون صدى السونار بنقل دفق الفيديو ، وقراءات التسارع (يمكنك استخدامه لإمالة العربة ونبرة العربة عندما تكون واقفة) ، وتدحرجًا ودرجات الصوت في درجات ديناميكية محسوبة بالفعل بواسطة الهاتف الذكي نفسه (خيار مناسب جدًا) ، التسارع الخطي في اتجاه السفر ، والإضاءة. بشكل عام ، بالطبع ، يمكنك نقل كل شيء يمكن لهاتفك الذكي قياسه من ضغط الهواء إلى الاتجاه إلى الشمال.نتيجةً لذلك ، حصل التطبيق على JAVA على النموذج التالي:
الشيء المضحك هو أنه يبدو حقًا وكأنه لوحة تحكم لسوفر القمر السوفيتي ، فقط لدي شاشة تلفزيون على الجانب ، ويوجد به في الوسط.
عند تشغيله ، قم أولاً بالاتصال بالعربة والهاتف الذكي عليها ، وحدد وضع التحكم اليدوي أو الحكم الذاتي الكامل - وانتقل! حتى تتحول نافذة درجة حرارة السائق إلى اللون الأصفر ثم تتحول إلى اللون الأحمر. الرسومات!شيء من هذا القبيل يبدو على الهواء مباشرة.لا أحضر البرنامج إلى هنا ، لأنه كالمعتاد ، يستغرق إنشاء النوافذ 95٪ من الرمز. يمكن العثور عليها هنا.في المستقبل ، يجب أن يتعلم الدماغ (الهاتف الذكي) نقل الفيديو العادي (وليس ما هو عليه الآن) إلى جهاز كمبيوتر ، حيث يجب التعرف عليه بطريقة جيدة (في الوقت الحالي ، الهدف هو إنشاء خريطة غرفة على مستوى الأرض وتحديد موقعها). حسنًا ، وفي ظل الشيوعية ، أود نقله إلى هاتفي الذكي حتى لا يحتاج إلى جهاز كمبيوتر.إذا كان هناك شيء على الأقل يعمل ، فسوف أقوم بنشره بالتأكيد. شكرا لاهتمامكم