مساء الخير أيها القراء! في المقالات السابقة على منصة ROS الروبوتية ، تطرقت إلى موضوع الأقلمة ورسم الخرائط ، على وجه الخصوص ، درسنا طرق SLAM: رسم الخرائط في
المقالة و hector_slam في
المقالة . في هذه المقالة ، سأستمر في التعرف على خوارزميات التوطين في ROS وتقديم نظرة عامة على العديد من خوارزميات القياس البصري المطبقة على منصة ROS. قياس المسافات البصري مهم في الروبوتات لأنه يسمح لك بتقييم حركة الروبوت وموقعه الحالي والتسارع بناءً على دفق الفيديو من الكاميرا. يمكنك استخدام إما كاميرا RGB عادية (في هذه الحالة ، تتحدث عن قياس اللون الأحادي) أو كاميرا ستيريو (قياس الاستريو) وحتى كاميرا RGBD.
عند استخدام كاميرات RGBD مثل Microsoft Kinect ، من الممكن الحصول على قياس بصري أكثر دقة من كاميرات الاستريو ، حيث نستخدم في هذه الحالة البيانات ثلاثية الأبعاد. في هذه المقالة سننظر في مثل هذه الخوارزميات. من يهتم بهذا الموضوع من فضلك تحت القط.
رتاباب
rtabmap هو في الأساس خوارزمية ROS SLAM. في هذه الحزمة ، بالإضافة إلى أدوات SLAM ، هناك تطبيق
odometryViewer لاختبار طرق مختلفة لقياس المسافات البصرية. في rtabmap ، يعمل قياس المسافات البصري على النحو التالي: لحساب قياس المسافات ، تستخدم الخوارزمية السمات المرئية التي تم الحصول عليها من صور RGB وبيانات العمق من خريطة العمق. باستخدام السمات المرئية المتطابقة (المطابقة) بين صورتين ، تحسب خوارزمية RANSAC التحول بين الإطارات المتتالية.
تثبيت rtabmap على ROS Indigo و Kinetic بسيط للغاية عبر apt-get:
sudo apt-get install ros-<version>-rtabmap ros-<version>-rtabmap-ros
يمكنك أيضًا تعيين rtabmap و rtabmap_ros من المصدر:
source /opt/ros/<version>/setup.bash cd ~ git clone https://github.com/introlab/rtabmap.git rtabmap cd rtabmap/build cmake .. make cd ~/catkin_ws git clone https://github.com/introlab/rtabmap_ros.git src/rtabmap_ros catkin_make -j1
تشغيل odometryViewer:
rtabmap-odometryViewer
تفتح نافذة مثل هذه:

حرك الكاميرا قليلاً:

دعونا نحاول العمل مع المعلمات. على سبيل المثال ، باستخدام طريقة حقيبة الكلمات (الافتراضي هو SURF):
rtabmap-odometryViewer -bow
استخدام طريقة حقيبة الكلمات مع واصف SIFT (0 = SURF ، 1 = SIFT)
rtabmap-odometryViewer -bow 1

باستخدام طريقة FAST + BRIEF:
rtabmap-odometryViewer -bin

يمكنك أيضًا تجربة قياس المسافات استنادًا إلى طريقة ICP (نقطة التكرار الأقرب) باستخدام خيار -icp.
يمكنك ضبط تردد المعالجة باستخدام معلمة هرتز (إطارات عدد صحيح في الثانية):
rtabmap-odometryViewer -hz 2
يمكنك أيضًا تكوين المعلمات الداخلية للخوارزمية ، مثل المسافة القصوى بين البطاريات ، والحد الأقصى لعدد العلامات المرئية للعثور على تطابق ، وعدد التكرارات في طريقة RANSAC / ICP.
بشكل عام ، أظهرت التجارب على قياس المسافات البصري لـ rtabmap أن الخوارزمية تعمل بسرعة ، دون تأخير ، وتحدد بدقة موضع الكاميرا بالنسبة للمشهد. ناقص الوحيد من الخوارزمية من حزمة rtabmap هو أنه عند استخدامه ، لم يكن من الممكن عرض بيانات قياس المسافات في rviz. هنا تحتاج إلى معرفة المزيد حول التكامل مع ROS.
حزمة Fovis_ros
تعمل الحزمة fovis_ros فقط تحت إصدار ROS Hydro. يوجد فرع Indigo في المستودع ، ولكن يتعطل fovis_ros مع وجود خطأ عند الترجمة في مساحة عمل catkin.
لتثبيت fovis_ros سنحتاج إلى مكتبة libfovis وحزمة fovis_ros نفسها. قم بتنزيلها من مستودعات github:
cd ~/catkin_ws/src git clone https://github.com/srv/libfovis.git cd libfovis git checkout hydro cd .. git clone https://github.com/srv/fovis.git cd fovis git checkout hydro cd ~/catkin_ws catkin_make source devel/setup.bash
هنا نحتاج إلى التأكد من اختيار الفرع الحالي بواسطة Hydro ، وإلا فقد تحدث مشاكل في التجميع (الفرع الحالي في المستودعات هو Indigo).
الآن قم بإنشاء قاذفة لإطلاق fovis_ros:
cd ~/catkin_ws/src git clone https://github.com/vovaekb/fovis_demo.git d ~/catkin_ws catkin_make source devel/setup.bash
تشغيل fovis_demo_runch:
roslaunch fovis_demo fovis_demo.launch
ستفتح نافذة rviz:

حرك الكاميرا قليلاً واحصل على موضع محدث:

ينشر fovis_ros البيانات في موضوعين: / kinect_odometer / odometry (odometry) و / kinect_odometer / pose (position).
الآن سنتعامل مع محتويات ملفات التشغيل في المثال الخاص بي. للحصول على معلومات ، يتم أخذ الملفات من كتاب "Learning ROS لبرمجة الروبوتات - الإصدار الثاني" من الفصل 5 المسمى رؤية الكمبيوتر.
لنبدأ بالملف الرئيسي fovis_demo.co.unch.
في الطابور
<arg name="mode" default="no_registered"/>
قمنا بتعيين معلمة الوضع على no_registered. هذا يعني أننا نستخدم معلومات عمق غير مسجلة ، أي لم يتم تسجيل خريطة العمق ولا يتم تحويلها إلى صورة من كاميرا RGB. يتم ذلك لتسريع المعالجة ، لأنه إذا تم تسجيل العمق ، فستعمل الخوارزمية ببطء.
تحقق من معدل تحديث عداد المسافات:
rostopic hz /kinect_odometer/odometry
نحصل على استنتاج مماثل:
average rate: 8.759 min: 0.084s max: 0.156s std dev: 0.02417s window: 9 average rate: 7.938 min: 0.084s max: 0.180s std dev: 0.02724s window: 16 average rate: 7.493 min: 0.084s max: 0.217s std dev: 0.03286s window: 23 average rate: 8.111 min: 0.068s max: 0.217s std dev: 0.03645s window: 33
قم بتشغيل fovis_demo مع تسجيل البرنامج باستخدام الوضع: = المعلمة sw_registered:
roslaunch fovis_demo fovis_demo.launch mode:=sw_registered
سوف نتلقى المعلومات التالية حول معدل تحديث عداد المسافات:
average rate: 0.963 min: 1.022s max: 1.056s std dev: 0.01676s window: 3 average rate: 0.968 min: 1.020s max: 1.056s std dev: 0.01635s window: 4 average rate: 1.212 min: 0.509s max: 1.056s std dev: 0.25435s window: 6
بعد ذلك ، نحدد ملف تكوين العرض لـ rviz:
<arg name="rviz_config" default="$(find fovis_demo)/config/rviz_$(arg mode).rviz"/>
لن أعتبر محتوياته هنا. سأقول فقط أنها تحدد مظهر نافذة rviz: الشاشات النشطة للموضوعات ، الإعدادات العامة مثل الإطار الثابت ، إلخ.
فيما يلي تعريف معلمة rviz وإطلاق برنامج تشغيل مستشعر Kinect ، اعتمادًا على معلمة الوضع:
<include file="$(find fovis_demo)/launch/openni_kinect_$(arg mode).launch"/>
قم بتشغيل قاذفة fovis من الحزمة الخاصة بنا أيضًا اعتمادًا على معلمة الوضع:
<include file="$(find fovis_demo)/launch/fovis_$(arg mode).launch"/>
نظرًا لأننا نقدر حركة الروبوت بناءً على حركة الكاميرا ، نحتاج إلى معرفة الإزاحة أو التحول من نظام إحداثيات الكاميرا إلى نظام إحداثيات الروبوت. للقيام بذلك ، نقوم بنشر تحويل ثابت بين أنظمة الإحداثيات base_link → camera_link باستخدام static_transform_publisher من حزمة tf:
<node pkg="tf" type="static_transform_publisher" name="base_to_camera_tf" args="0 0 -0.05 0 0 0 base_link camera_link 100"/>
أخيرًا ، قم بتشغيل rviz:
<group if="$(arg rviz)"> <node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rviz_config)"/> </group>
لن أفكر في بقية ملفات المشغل في هذه المقالة. يمكن القيام بذلك بشكل مستقل إذا رغبت في ذلك. سأقول فقط أنه عندما يتم تشغيل fovis_ros باستخدام وضع المعلمة = sw_registered ، فإننا نقوم بإختناق الإطارات من كاميرا RGB ، أي إعادة نشر الرسائل من موضوع إلى آخر بتردد تحديث أقل (2.5 هرتز) (يمكن قراءة المزيد من التفاصيل حول هذا
هنا ).
بالنسبة لأولئك الذين يرغبون في استكشاف خوارزمية fovis بعمق ، هناك
مقالة عن تفاصيل الخوارزمية.
أظهرت التجارب مع قياس المسافات البصري fovis_ros أن الخوارزمية لا تعمل بسرعة rtabmap ، مع تأخيرات صغيرة عند تحريك الكاميرا ، ولكنها لا تزال تحدد بدقة موقع الكاميرا بالنسبة للمشهد.
آمل أن تكون هذه المراجعة لخوارزميات القياس البصري مفيدة في عملك وتساعدك على حل بعض المشاكل. أتمنى لكم التوفيق في مشاريعكم وأراكم قريباً!
ملاحظة: أطلب منك أيضًا المشاركة في الاستطلاع واختيار إصدار ROS الذي تستخدمه في عملك.