الاستخدام العملي لـ ROS على Raspberry Pi - الجزء 3

مساء الخير أيها القراء الهبر!

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

متعددة مع tmux


في هذه الأثناء ، أريد أن أخبرك عن خدعة واحدة تسمح لك بالعمل عن بعد على Raspberry Pi عبر SSH في نفس الوقت في عدة محطات طرفية. للقيام بذلك ، قم بتثبيت أداة tmux على RPi.

$ sudo apt-get install tmux

بعد ذلك ، قم بتشغيل الأداة المساعدة:

$ tmux

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

اضغط على Ctrl + B و C على لوحة المفاتيح. ستظهر نافذة أخرى بالرقم 1. جرّب أيضًا الجمع بين Ctrl + B و٪. سيتم تقسيم النافذة الطرفية الحالية في المنتصف بشريط أخضر رأسي إلى نافذتين (جزء). إذا قمت بالضغط على مجموعة Ctrl + B ، وأدخلت "نافذة تقسيم" ، سيتم تقسيم النافذة أفقيًا إلى نافذتين متطابقتين. لإزالة لوحة (الجزء) ، استخدم المجموعة Ctrl + B ، X ثم اضغط Y. للتبديل إلى لوحة أخرى في نفس النافذة ، استخدم المجموعة Ctrl + B ، O. للتبديل بين النوافذ الطرفية برقم النافذة ، استخدم المجموعة Ctrl + ب ، <رقم النافذة>.

الآن قم بإضافة إطلاق البرنامج إلى ملف ~ / .bashrc لبدء التشغيل تلقائيًا عند فتح محطة طرفية جديدة. أضف الأسطر التالية إلى الملف:

[[ $TERM != "screen" ]] && exec tmux


العمل مع teleop_twist_keyboard


الآن دعونا نتعرف على حزمة teleop_twist_keyboard.
شغّل النص البرمجي teleop_twist_keyboard.py من حزمة teleop_twist_keyboard كعقدة ROS عادية:

$ roscore
$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py

نحصل على استنتاج مثل هذا:

Reading from the keyboard  and Publishing to Twist!
---------------------------
Moving around:
   u    i    o
   j    k    l
   m    ,    .

q/z : increase/decrease max speeds by 10%
w/x : increase/decrease only linear speed by 10%
e/c : increase/decrease only angular speed by 10%
anything else : stop

CTRL-C to quit

لنذكر جميع المواضيع النشطة حاليًا:

$ rostopic list

يجب أن يظهر الموضوع / cmd_vel في القائمة. في هذا الموضوع ، تنشر العقدة teleop_twist_keyboard الرسائل في كل مرة يتم فيها الضغط على مفتاح على لوحة المفاتيح.
دعنا نظهر مخرجات الرسائل المنشورة في الموضوع / cmd_vel:

$ rostopic echo cmd_vel

قم بتشغيل rqt_graph لتمثيل الرسم البياني المحوسب لـ ROS في شكل رسومي. يعرض الرسم البياني الحسابي جميع العقد والموضوعات النشطة التي تربطها.

$ rosrun rqt_graph rqt_graph

الصورة

نرى هنا أن العقدة teleop_twist_keyboard تنشر رسائل إلى الموضوع / cmd_vel ، وتشترك العقدة الاستدراكية في هذا الموضوع (أمر صدى rostopic).
دعنا نتعرف على نوع الرسائل المنشورة حول الموضوع / cmd_vel:

$ rostopic type /cmd_vel

سيخرج الأمر الخط:

geometry_msgs/Twist

هذا يعني أن الرسائل من النوع Twist من حزمة ROS القياسية geometry_msgs.
يمكننا أيضًا الحصول على معلومات حول بنية الرسالة باستخدام الأمر rosmsg:

$ rosmsg show geometry_msgs/Twist


geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z

الحقل "الخطي" مسؤول عن السرعة الخطية ، "الزاوي" هو عن السرعة الزاوية.
اضغط على مفتاح "i" ، وسيكون الناتج على هذا النحو (مرتبط بالمضي قدمًا):

linear: 
  x: 0.5
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: 0.0
---

اضغط على مفتاح "k" ، وسيكون الإخراج على هذا النحو (توقف):

linear: 
  x: 0.0
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: 0.0
---

اضغط على مفتاح "u" ، وسيكون الإخراج على هذا النحو (انعطف يسارًا):

linear: 
  x: 0.5
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: 1.0
---

وأخيرًا ، عند الضغط على مفتاح "o" ، نحصل على الإخراج التالي (انعطف يمينًا):

linear: 
  x: 0.5
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: -1.0
---

المفتاحان 'j' و 'l' مسؤولان عن الدوران لليسار واليمين في مكانهما (بدون المضي قدمًا).

التحكم في لوحة المفاتيح الآلية باستخدام teleop_twist_keyboard


لقد كتبت بالفعل رسم تخطيطي للتحكم في الروبوت بالضغط على المفاتيح. نحن ببساطة نشترك في الموضوع / cmd_vel ، واعتمادًا على القيمة المتلقاة لكل من السرعات ، نعطي الأمر الضروري لوحدة التحكم في الحركة (التحرك للأمام أو الإيقاف أو الانعطاف يسارًا أو يمينًا). يمكن تنزيل Sketch من هنا .
دعونا نحلل رمز الرسم بمزيد من التفاصيل.
في بداية الملف ، بالإضافة إلى ملف رأس ros.h القياسي ، نقوم بتوصيل ملفين إضافيين بأنواع الرسائل geometry_msgs / Twist.h و geometry_msgs / Vector3.h:

#include <geometry_msgs/Twist.h>
#include <geometry_msgs/Vector3.h>

نعلن روس معالج العقدة :: NodeHandle:

ros::NodeHandle nh;

القيمة الرئيسية هي طريقة messageCb:

void messageCb(const geometry_msgs::Twist& message) 
{
  geometry_msgs::Vector3 linear = message.linear;
  float forward_vel = float(linear.x);
  
  if(forward_vel == 0) { stop(); return; }
  
  geometry_msgs::Vector3 angular = message.angular;
  float ang_vel = float(angular.z);
  
  if(ang_vel > 0) { turnLeft(); }
  else if(ang_vel < 0) { turnRight(); }
  else { goForward(); }
}

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

ros::Subscriber<geometry_msgs::Twist> sub("/cmd_vel", &messageCb);

مع الاشارة الى طريقة معالجة الرسائل (messageCb) ونوع الرسالة المستلمة - geometry_msgs :: Twist.
في نهاية البرنامج النصي ، تتبع طرق الرسم القياسية لـ rosserial_arduino:

nh.initNode();
nh.subscribe(sub);
Serial.begin(57600);

قم بتشغيل خادم rosserial_arduino:

$ rosrun rosserial_python serial_node _port:=/dev/ttyACM0

وتحميل الرسم على لوحة اردوينو.

قم بالتبديل إلى الوحدة الطرفية حيث يتم تشغيل عقدة teleop_twist_keyboard ، حاول الضغط على المفاتيح "u" و "i" و "o" و "k" وتحقق من إخراج خادم rosserial في المحطة.

وبالتالي ، باستخدام حزمة teleop_twist_keyboard ، يمكننا الآن إجراء تحكم بسيط عن بعد في الروبوت عن طريق إرسال أوامر الحركة: التحرك للأمام أو الإيقاف أو الدوران لليسار أو اليمين. في المستقبل ، سوف نتعلم كيفية التحكم في الروبوت باستخدام عصا التحكم ، وهو أكثر ملاءمة باستخدام حزمة أخرى في ROS. ولكن المزيد عن ذلك في المقالة التالية.

Source: https://habr.com/ru/post/ar390851/


All Articles