مساء الخير أيها القراء الهبر! هذه هي المقالة الثانية في سلسلة من المقالات حول الاستخدام العملي لـ ROS على Raspberry Pi. في المقالة الأولى من السلسلة ، وصفت تثبيت مكونات ROS اللازمة وتهيئة بيئة العمل للعمل.في الجزء الثاني من السلسلة ، سنبدأ في الاستخدام العملي لميزات ROS على منصة Raspberry Pi. على وجه التحديد ، في هذه المقالة سوف أتحدث عن استخدام لوحة الكاميرا Raspberry Pi على Raspberry Pi بالتعاون مع ROS لحل مشاكل رؤية الكمبيوتر. من يهمه الأمر ، من فضلك ، تحت القط.مجلس الكاميرا الكاميرا RPi
للعمل ، سنحتاج إلى كاميرا Raspberry Pi Camera Board:
تتصل هذه الكاميرا مباشرة بوحدة معالجة الرسومات عبر موصل CSi على اللوحة ، مما يسمح لك بتسجيل وترميز الصورة من الكاميرا دون استخدام وقت المعالج. يتم استخدام كابل ZIF لتوصيل الكاميرا. يقع موصل الكبل الموجود على اللوحة بين منفذي Ethernet و HDMI:
تركيب المكتبة
لذلك دعونا ننتقل إلى تركيب المكتبات الضرورية. أولاً ، قم بتثبيت OpenCV:$ sudo apt-get install libopencv-dev
لاستخدام كاميرا Raspberry Pi ، سنحتاج إلى مكتبة raspicam. قم بتنزيل الأرشيف من هنا .بعد ذلك ، قم بتثبيت المكتبة:$ tar xvzf raspicamxx.tgz
$ cd raspicamxx
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
$ sudo ldconfig
تحتاج إلى تمكين دعم الكاميرا في Raspbian من خلال برنامج raspi-config:$ sudo raspi-config
حدد الخيار 5 - تمكين الكاميرا وحفظ التحديد وإعادة تشغيل النظام.ابدأ مع ROS
من أجل الراحة ، قم بإنشاء ورشة عمل جديدة للقطن لمجموعاتنا:$ mkdir -p ~/driverobot_ws/src
$ cd ~/driverobot_ws/src
$ catkin_init_workspace
$ cd ~/driverobot_ws
$ catkin_make
قم بإنشاء حزمة ROS جديدة:$ cd src/
$ catkin_create_pkg raspi_cam_ros image_transport cv_bridge roscpp std_msgs sensor_msgs compressed_image_transport opencv2
مواصفات الأمر catkin_create_pkg هي كما يلي: catkin_create_pkg <package_name> [تعتمد على] [تعتمد على] ،حيث يمكنك تحديد أي تبعيات ضمن المكتبة - المكتبات التي ستستخدمها الحزمة.ينشئ هذا الأمر إطار عمل مشروع ROS: دليل src فارغ لنصوص العقدة وملفات التكوين CMakeLists.txt و package.xml.لقد وجدت نصًا بسيطًا يتلقى الإطارات من الكاميرا وينشرها باستخدام "الناشر" (الناشر) ، وقمت بتكييفه مع ROS Indigo. يمكنك تنزيله من هنا .لاستخدامه ، تحتاج إلى تثبيت برنامج تشغيل الكاميرا Raspberry Pi UV4L:$ curl http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc | sudo apt-key add -
أضف السطر التالي إلى ملف /etc/apt/sources.listdeb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main
تحديث الحزم وتثبيتها:$ sudo apt-get update
$ sudo apt-get install uv4l uv4l-raspicam
لتنزيل برنامج التشغيل ، في كل تمهيد للنظام ، نقوم أيضًا بتثبيت حزمة اختيارية:$ sudo apt-get install uv4l-raspicam-extras
دعنا ننتقل إلى تحرير الحزمة. قم بلصق الخطوط من هنا في ملف CMakeLists.txt الخاص بك .أهم الأسطر في ملف CMakeLists.txt:link_directories(/usr/lib/uv4l/uv4lext/armv6l/)
…
target_link_libraries(capture ${catkin_LIBRARIES} uv4lext)
وبالتالي ، نضيف رابطًا إلى برنامج تشغيل uv4l ، وهو ضروري لتجميع الحزمة.في نهاية الملف ، قمنا بتعيين خطوط خاصة للعقدة لدينا:add_executable(capture src/capturer.cpp)
target_link_libraries(capture ${catkin_LIBRARIES} uv4lext)
ينشئ سطر add_executable ثنائي للتشغيل ويربط target_link_lbraries مكتبات إضافية لثنائي الالتقاط.الصق الأسطر المفقودة من هنا في ملف package.xml بحيث يبدو كالتالي:<?xml version="1.0"?>
<package>
<name>raspi_cam_ros</name>
<version>0.0.0</version>
<description>The raspi_cam_ros package</description>
<maintainer email="pi@todo.todo">pi</maintainer>
<license>TODO</license>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>cv_bridge</build_depend>
<build_depend>image_transport</build_depend>
<build_depend>roscpp</build_depend>
<build_depend>std_msgs</build_depend>
<build_depend>sensor_msgs</build_depend>
<build_depend>opencv2</build_depend>
<build_depend>compressed_image_transport</build_depend>
<run_depend>cv_bridge</run_depend>
<run_depend>image_transport</run_depend>
<run_depend>roscpp</run_depend>
<run_depend>std_msgs</run_depend>
<run_depend>sensor_msgs</run_depend>
<run_depend>opencv2</run_depend>
<run_depend>compressed_image_transport</run_depend>
</package>
في السطور الأولى ، يتم تعيين المعلمات الأساسية للعقدة - الاسم والنسخة والوصف والمعلومات حول المؤلف. تحدد أسطر build_depend تبعيات المكتبة المطلوبة لتجميع الحزمة ، وتحدد أسطر run_depend التبعيات اللازمة لتشغيل التعليمات البرمجية في الحزمة.قم بإنشاء ملف capturer.cpp داخل المجلد src والصق الأسطر من هنا . هنا في الطريقة الرئيسية () ، تتم تهيئة العقدة وتبدأ في حلقة:ros::init(argc, argv,"raspi_cam_ros");
ros::NodeHandle n;
UsbCamNode a(n);
a.spin();
المنطق الكامل للبرنامج النصي هو أننا نحصل على الصورة من الكاميرا باستخدام OpenCV ، نلفها في رسالة لـ ROS في طريقة fillImage وننشرها على الموضوع. هنا يتم استخدام حزمة image_transport لإنشاء صورة "الناشر".قم بتشغيل برنامج تشغيل uv4l عن طريق تشغيل الأمر:$ uv4l --driver raspicam --auto-video_nr --width 640 --height 480 --nopreview
ما سيخلق تدفق MJPEG.تجميع عقدة ROS لدينا:$ roscore
$ cd ~/driverobot_ws
$ catkin_make
تحقق من قيمة المتغير ROS_PACKAGE_PATH:echo $ROS_PACKAGE_PATH
/opt/ros/indigo/share:/opt/ros/indigo/stacks
يجب أن تتضمن قيمة المتغير ROS_PACKAGE_PATH المسار إلى مساحة العمل الخاصة بنا. أضف مساحة ورشة العمل إلى المسار:$ source devel/setup.bash
الآن عند تشغيل الأمر echo $ ROS_PACKAGE_PATH مرة أخرى ، يجب أن نرى نتيجة مماثلة:/home/youruser/catkin_ws/src:/opt/ros/indigo/share:/opt/ros/indigo/stacks
، حيث / home / <user_name> / catkin_ws / src هو المسار إلى مساحة العمل الخاصة بنا. هذا يعني أن ROS يمكنها "رؤية" العقد التي تم إنشاؤها في catkin_ws ويمكننا تشغيلها من خلال rosrun.قم بتشغيل عقدة ROS الخاصة بنا:$ rosrun raspi_cam_ros capture
قم بتشغيل البرنامج الرسومي rqt_image_view لعرض دفق الفيديو من الموضوع:$ rosrun rqt_image_view rqt_image_view
حدد موضوع image_raw في نافذة rqt_image_view.
عند بدء العقدة ، قد يحدث الخطأ "Gtk-WARNING **: لا يمكن فتح العرض: -1" عند العمل عبر ssh أو "GdkGLExt-WARNING **: نظام النوافذ لا يدعم OpenGL." عند التشغيل في وضع VNC Remote Desktop. الحل هو الاتصال بـ Raspberry Pi عبر SSH مع إعادة توجيه X11:$ ssh -X pi@<host_pi>
يمكنك معرفة عدد مرات نشر المشاركات إلى الموضوع باستخدام الأمر rostopic:rostopic hz image_raw
يقوم هذا الأمر بحساب تكرار تلقي الرسائل لكل موضوع في كل ثانية وعرضه في وحدة التحكم.بالنسبة للطراز B + ، كان لدي استنتاج مثل هذا:average rate: 7.905
min: 0.075s max: 0.249s std dev: 0.02756s
كما ترون ، فإن تردد الإرسال هو 8 هرتز.راجعت أيضًا وتيرة نشر الصور من الكاميرا على نموذج RPi 2. هنا كانت النتائج أفضل عدة مرات:average rate: 30.005
min: 0.024s max: 0.043s std dev: 0.00272s
تم نشر الرسائل بالفعل بتردد 30 هرتز ، وهي زيادة جيدة جدًا في السرعة مقارنة بنموذج B +.تحكم آلي مرئي باستخدام OpenCV و ROS
الآن سنكتب حزمة ROS صغيرة لاستخدام رؤية الكمبيوتر على الروبوت باستخدام Raspberry Pi ، والتي ستقوم بإجراء خوارزمية التعرف (في حالتنا ، التوجيه المرئي باستخدام طريقة تتبع الخط) ونشر قيمة إزاحة الروبوت المطلوبة للموضوع. من ناحية أخرى ، ستشترك عقدة التحكم في حركة الروبوت في هذا الموضوع وترسل أوامر التحكم في الحركة إلى Arduino.لنقم الآن بإضافة "ناشر" إلى البرنامج النصي capturer.cpp ، الذي سينشر قيمة النقل. أولاً ، قم بتمكين تعريف نوع الرسالة لقيمة النقل - std_msgs / Int16.#include <std_msgs/Int16.h>
يأخذ rosserial ملفات رسائل msg خاصة ويقوم بإنشاء رمز مصدر لها. يتم استخدام القالب التالي: يتم تخزين التعليمات البرمجية المصدر لرسائل rosserial القياسية في مجلد package_name داخل دليل ros_lib. بعد ذلك ، نقوم بتهيئة الرسالة لهذا النوع:package_name/msg/Foo.msg → package_name::Foo
std_msgs::Int16 shift_msg;
إنشاء "ناشر":ros::Publisher shift_pub;
وداخل مُنشئ UsbCamNode نعطيه تعريفًا:shift_pub = nh.advertise<std_msgs/Int16>(“line_shift”, 1);
نقوم هنا بتعيين نوع الرسائل واسم الموضوع للنشر.بعد ذلك ، أضف المنطق لحساب قيمة إزاحة الخط باستخدام OpenCV ونشره إلى موضوع line_shift في طريقة take_and_send_image () قبل السطر #ifdef OUTPUT_ENABLED:
shift_msg.data = offset;
shift_pub.publish(shift_msg);
ليس لدي خوارزمية تتبع خط جاهزة ، لذلك القارئ حر في كتابة منطقه هنا.في الواقع ، يتم تخزين البيانات الموجودة في الرسالة في حقل البيانات. يمكن عرض هيكل الرسالة باستخدام الأمر:$ rosmsg show std_msgs/Int16
الآن قم بتشغيل العقدة:$ rosrun raspi_cam_ros capturer
نستخدم الأمر rostopic echo لإخراج البيانات المنشورة في موضوع line_shift:$ rostopic echo line_shift
أضف الآن "مشترك" إلى عقدة التحكم في الروبوت. تمكين تعريف نوع الرسالة:#include <std_msgs/UInt16.h>
ثم نضيف وظيفة رد اتصال يتم تنفيذها عند تلقي رسالة من الموضوع.void messageCb(const std_msgs::UInt16& message)
{
int shift_val = int(message.data);
char* log_msg;
if(shift_val < 0) log_msg = "Left";
else if(shift_val > 0 ) log_msg = "Right";
else log_msg = "Forward";
nh.loginfo(log_msg);
}
يجب أن تكون وظيفة رد الاتصال من النوع باطل وأن تأخذ مرجع ثابت لنوع الرسالة كوسيطة.من أجل البساطة ، أسجل رسالة حول اتجاه إزاحة الخط. هنا يمكنك إضافة منطق حركة الروبوت الخاص بك لسيناريو الخاص بك.قم بإنشاء مشترك للرسائل من الموضوع line_shift.ros::Subscriber<std_msgs::UInt16> sub("line_shift", &messageCb);
نقوم هنا بتعيين اسم الموضوع ورابط لوظيفة رد الاتصال.بعد ذلك تأتي طرق الرسم القياسية لـ rosserial_arduino:void setup()
{
nh.initNode();
nh.subscribe(sub);
Serial.begin(57600);
}
void loop()
{
nh.spinOnce();
delay(100);
}
والفرق الوحيد هو أننا نضيف nh.subscribe (sub) لإنشاء "اشتراك" فعلي للموقع في الموضوع.يمكن تنزيل رسم تخطيطي للتحكم في الروبوت من هنا .خدعة صغيرة! في ROS ، هناك ملفات تشغيل خاصة تسمح لك بتشغيل العقد كعمليات منفصلة تلقائيًا مع معلمات معينة. يتم إنشاء ملفات التشغيل بتنسيق xml ويتيح لك تركيبها تشغيل العديد من العقد دفعة واحدة. ومع ذلك ، لا يضمن ملف التشغيل تشغيل العقد بالترتيب المحدد المحدد.يمكنك إنشاء ملف تشغيل لتسهيل بدء تشغيل خادم rosserial_python.$ cd <catkin_ws>/src
$ catkin_create_pkg rosserial_controller
$ cd src/rosserial_controller
$ vim rosserial_controller.launch
نكتب ملف الإطلاق بالمحتوى التالي:<launch>
<node pkg="rosserial_python" type="serial_node.py" name="arduino_serial">
<param name="port" value="/dev/ttyACM0"/>
</node>
</launch>
تجميع وتشغيله:$ cd ~/<catkin_ws>
$ catkin_make
$ source devel/setup.bash
$ roslaunch rosserial_controller rosserial_controller.launch
يمكننا تصور القيم المنشورة في السطر line_shift باستخدام الأداة المساعدة rqt_plot ، كما هو الحال في المقالة :$ rqt_plot line_shift
يمكنك الآن الاستفادة الكاملة من Raspberry Pi Camera ومكتبة OpenCV في سيناريوهاتك للتوجيه البصري للروبوت والتعرف على الكائنات والتتبع وغير ذلك الكثير. أطلق العنان لخيالك!في المرة القادمة سنتحدث عن التحكم في الروبوت في وضع التشغيل عن بعد بالضغط على المفاتيح على لوحة المفاتيح.ملاحظة. تحتوي الشبكة على أوراق غش مفيدة - ROS Cheatsheet. بالنسبة إلى إصدار ROS Indigo ، يمكن تنزيله من هنا .