المشاركات في السلسلة:
8. نحن نتحكم من الهاتف ROS Control ، GPS العقدة7. توطين الروبوت: gmapping ، AMCL ، النقاط المرجعية على خريطة الغرفة6. المسافات مع ترميز عجلة ، خريطة الغرفة ، ليدار5. نحن نعمل في rviz وشرفة المراقبة: xacro ، أجهزة استشعار جديدة.4. قم بإنشاء محاكاة روبوت باستخدام محرري rviz و gazebo.3. تسريع ، تغيير الكاميرا ، إصلاح المشية2. البرمجيات1. الحديدآخر مرة ، تم تحقيق الأهداف التالية:
- تصور الروبوت من خلال إنشاء ملف xacro يحتوي على وصف urdf الخاص بالروبوت ؛
- إنشاء ملفين للإطلاق ، أحدهما يسمح لك بوضع الروبوت في Gazebo-editor.
- السيطرة على الروبوت في محاكاة Gazebo من لوحة المفاتيح.
في هذا المنشور ، سوف نقوم بترتيب المشروع في شكل وحدات xacro بحيث يصبح أكثر قابلية للقراءة (في وقت سابق ، من أجل الوضوح ، دفعنا الوصف بالكامل إلى ملف xacro واحد). أضف كاميرا فيديو افتراضية و imu. دعونا نرى كيفية إضافة شرفة إلى كائنات غريبة في العالم من حولنا.
أولاً ، تحقق مما إذا كان الجهاز يتنقل عبر نظام ROS باستخدام أوامر roscd:
roscd rosbots_description/launch
إذا لم ينجح ذلك ، فانتقل إلى المجلد باستخدام catkin_ws وقم بتنفيذ الأمر:
source devel/setup.bash
الآن دعنا نذهب إلى المجلد مع وصف الروبوت:
roscd rosbots_description/launch
في ملف spawn.launch الذي تم إنشاؤه مسبقًا ، تمت الإشارة إلى ما يلي:
<param name="robot_description" command="cat '$(find rosbots_description)/urdf/rosbots.xacro'" />
تم استخدام الأمر
cat لتحميل محتويات rosbots.xacro في المعلمة robot_description.
للاستفادة الكاملة من تنسيق أمر xacro ، يحتاج الرمز إلى تصحيح بسيط. يستعاض عن السطر أعلاه بما يلي:
<param name="robot_description" command="$(find xacro)/xacro.py '$(find rosbots_description)/urdf/rosbots.xacro'" />
الآن سوف يستخدم النظام xacro.py لتنفيذ rosbots.xacro.
ستكون التغييرات نفسها مطلوبة لملف الإطلاق الثاني - rviz.launch.
تغيير
<param name="robot_description" command="cat '$(find rosbots_description)/urdf/rosbots.xacro'" />
في
<param name="robot_description" command="$(find xacro)/xacro.py '$(find rosbots_description)/urdf/rosbots.xacro'"/>
تحقق من أن كل شيء يعمل مع بناء الجملة الجديد.
أولاً ، انظر إلى النموذج في محرر rviz:
roslaunch rosbots_description rviz.launch
ثم ، إغلاق rviz ، تحقق في شرفة.
المحطة الأولى:
roslaunch gazebo_ros empty_world.launch
2:
roslaunch rosbots_description spawn.launch
* يمكنك رؤية الرسائل
اللون الاصفر xacro: Traditional processing is deprecated. Switch to --inorder processing! To check for compatibility of your document, use option --check-order. For more infos, see http://wiki.ros.org/xacro#Processing_Order xacro.py is deprecated; please use xacro instead
أنها لا تعطي الطقس ، لذلك لا يمكنك الانتباه.
لذلك ، كل شيء يعمل كما كان من قبل ، والآن فقط يتم استخدام تنسيق xacro.
ماذا يعطي؟ يسمح لك هذا التنسيق بإعادة تنظيم الكود. مع نمو المشروع ، سيمكن ذلك من التنقل بشكل أفضل في المستقبل.
العمل مع xacro
الآن حان الوقت لتقسيم rosbots.xacro إلى الأجزاء المكونة له والاستفادة من xacro.
انقل كل شيء عن محرر gazebo (علامات gazebo) من rosbots.xacro إلى ملف جديد.
قم بإنشاء ملف rosbots.gazebo.xacro في مجلد urdf:
nano rosbots.gazebo.xacro
و ضع الكود هناك:
rosbots.gazebo.xacro <?xml version="1.0"?> <robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="rosbots" > <gazebo> <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so"> <legacyMode>false</legacyMode> <alwaysOn>true</alwaysOn> <publishWheelTF>true</publishWheelTF> <publishTf>1</publishTf> <publishWheelJointState>true</publishWheelJointState> <updateRate>100.0</updateRate> <leftJoint>wheel_left_joint</leftJoint> <rightJoint>wheel_right_joint</rightJoint> <wheelSeparation>1.1</wheelSeparation> <wheelDiameter>0.52</wheelDiameter> <wheelAcceleration>1.0</wheelAcceleration> <torque>20</torque> <commandTopic>/part2_cmr/cmd_vel</commandTopic> <odometryTopic>odom</odometryTopic> <odometryFrame>odom</odometryFrame> <robotBaseFrame>base_link</robotBaseFrame> </plugin> </gazebo> </robot>
نفس الرمز داخل العلامة
<gazebo> </gazebo>
حذف من ملف rosbots.xacro.
سنقوم الآن بإرفاق الملف المنشأ حديثًا بـ rosbots.xacro. من مكان ما ، يجب أن يتم استلام نفس المعلومات حول مكون شرفة المراقبة من rosbots.xacro!
وفقًا لذلك ، أضف إلى rosbots.xacro:
<xacro:include filename="$(find rosbots_description)/urdf/rosbots.gazebo.xacro" />
أدخل هذا السطر بعد السطر الذي يحتوي على العلامة
<robot>
. تبدو بداية الملف الآن كما يلي:
<robot name="rosbots" xmlns:xacro="http://www.ros.org/wiki/xacro"> <xacro:include filename="$(find rosbots_description)/urdf/rosbots.gazebo.xacro" />
تحقق مرة أخرى من أن كل شيء يعمل بالتنسيق الجديد:
المحطة الأولى:
roslaunch gazebo_ros empty_world.launch
2:
roslaunch rosbots_description spawn.launch
وبالتالي ، بالنسبة للمستخدم ، يبقى كل شيء في مكانه من حيث إطلاق النموذج في المحاكاة ، والأوامر هي نفسها.
إضافة أجهزة استشعار جديدة
الآن بعد أن ألقى المشروع نظرة أكثر أو أقل تنظيماً ، سنقوم بتوصيل أجهزة استشعار إضافية.
من أجل عدم تشوش الروبوت بشدة باستخدام "مجموعات الجسم" ، نضيف مستشعرين فقط: كاميرا وإيمو (وحدة قياس بالقصور الذاتي أو جيروسكوب).
لهذه الأغراض ، ستحتاج إلى إصلاح ملفات rosbots.xacro و rosbots.gazebo.xacro.
لنبدأ بالكاميرا وملف rosbots.xacro. لكي تعمل كل الأشياء ، يجب أن تضيف إلى المستشعر:
- التواصل (الرابط). سيمثلها ملف داي.
- مفصل ، والتي سوف تعلق الكاميرا على جسم الروبوت.
في ملف آخر - rosbots.gazebo.xacro - سنضيف:
- البرنامج المساعد الذي سيكشف الرابط الذي تم إنشاؤه أعلاه كجهاز استشعار.
نضعه في rosbots.xacro داخل العلامة (للراحة ، يمكنك إضافته في النهاية):
rosbots.xacro <joint name="camera_joint" type="fixed"> <origin xyz="0.49 -0.03 0.75" rpy="0 0.21 0" /> <parent link="base_link"/> <child link="camera_link" /> </joint> <link name="camera_link"> <visual> <geometry> <mesh filename="package://rosbots_description/meshes/camera.dae" scale="4.0 4.0 4.0"/> </geometry> <origin xyz="0.0 0 0" rpy="0 0 0"/> </visual> <collision> <geometry> <mesh filename="package://rosbots_description/meshes/camera.dae" scale="4.0 4.0 4.0"/> </geometry> <origin xyz="0.0 0 0" rpy="0 0 0"/> </collision> </link>
يضيف الرمز أعلاه ارتباطًا ومشتركًا إلى الكاميرا ، مما يسمح بتصورها.
تحقق من ذلك.
المحطة الأولى:
roslaunch gazebo_ros empty_world.launch
2:
roslaunch rosbots_description spawn.launch
إذا كان كل شيء صحيحًا ، فيمكنك رؤية الكاميرا المضافة على الروبوت (أبيض):

يبدو أن كل شيء بسيط. ومع ذلك ، يجب أن يكون مفهوما أنه تم إضافة التصور الكاميرا فقط. كيف ستتصرف هذه الكاميرا في عالم الأشياء المادية ليست واضحة بعد. سلوكها غير محدد. الكاميرا ليست قادرة بعد على التقاط الصور أو تصوير الفيديوهات.
حان الوقت للعمل على الملف باستخدام شرفة المراقبة.
أضف إلى
rosbots.gazebo.xacroداخل العلامات
<robot> </robot>
إضافة:
<gazebo reference="camera_link"> <sensor type="camera" name="camera1"> <update_rate>30.0</update_rate> <camera name="head"> <horizontal_fov>1.04</horizontal_fov> <image> <width>320</width> <height>240</height> <format>R8G8B8</format> </image> <clip> <near>0.1</near> <far>50</far> </clip> </camera> <plugin name="camera_controller" filename="libgazebo_ros_camera.so"> <alwaysOn>true</alwaysOn> <updateRate>0</updateRate> <cameraName>camera1</cameraName> <imageTopicName>image_raw</imageTopicName> <cameraInfoTopicName>camera_info</cameraInfoTopicName> <frameName>camera</frameName> <hackBaseline>0.07</hackBaseline> <distortionK1>0.0</distortionK1> <distortionK2>0.0</distortionK2> <distortionK3>0.0</distortionK3> <distortionT1>0.0</distortionT1> <distortionT2>0.0</distortionT2> </plugin> </sensor> </gazebo>
نظرًا لأنه يسهل تخمين الشفرة ، فقد حددنا معلمات الكاميرا:
- update_rate: عدد مرات وصول البيانات
- العرض / الارتفاع: دقة الصور. في هذه الحالة ، 320 × 240.
- التنسيق: تنسيق الفيديو (R8G8B8).
- imageTopicName: اسم الموضوع الذي سيتم إرسال البيانات إليه
- frameName: رابط الرابط الذي سيتم توصيل الكاميرا به.
الآن أصبح كل شيء جاهزًا لتصور الكاميرا ومحاكاةها.
إذا قمت بإعادة تشغيل المحاكاة الآن وشاهدت قائمة الموضوعات ، يمكنك أن ترى أنه من بين الموضوعات التي تم إنشاؤها بواسطة الكاميرا تمت إضافة:
rostopic list
/rosbots/camera1/camera_info /rosbots/camera1/image_raw /rosbots/camera1/image_raw/compressed /rosbots/camera1/image_raw/compressed/parameter_descriptions /rosbots/camera1/image_raw/compressed/parameter_updates /rosbots/camera1/image_raw/compressedDepth /rosbots/camera1/image_raw/compressedDepth/parameter_descriptions /rosbots/camera1/image_raw/compressedDepth/parameter_updates /rosbots/camera1/image_raw/theora /rosbots/camera1/image_raw/theora/parameter_descriptions /rosbots/camera1/image_raw/theora/parameter_updates /rosbots/camera1/parameter_descriptions /rosbots/camera1/parameter_updates
هناك ترسانة كاملة من المواضيع! ولكن ، كقاعدة عامة ، لا يتم استخدام كل منهم في كثير من الأحيان باستثناء الثلاثة الأولى.
الصورة في rviz من محاكاة شرفة
* تجدر الإشارة هنا إلى أنه في التكوين الحالي للصورة ، فإن تعطل شرفة المراقبة الخاصة بـ VMWare Workstation عند محاولة بدء البث إلى rviz من كاميرا فيديو افتراضية. تتم الإشارة إلى حل ممكن في نهاية المنشور في قسم الخطأ.للوضوح ، عند العمل مع الكاميرا في المحاكاة ، قم بتشغيل rviz ووضع بعض الأشياء أمام الروبوت.
للقيام بذلك ، تحتاج أولاً إلى الكائن نفسه ، والذي سيتم إضافته إلى شرفة المراقبة.
قم بتنزيل ملف
object.urdf ووضعه في ~ / catkin_ws / src /
دعونا تشغيله.
المحطة الأولى:
roslaunch gazebo_ros empty_world.launch
الثاني (ضع الموديلات):
rosrun gazebo_ros spawn_model -file /home/pi/catkin_ws/src/object.urdf -urdf -x 1 -y 0 -z 1 -model my_object
roslaunch rosbots_description spawn.launch
في المحاكاة نحصل على الصورة التالية:

نموذج روبوت ونشرة تم إضافتها أيضًا كنموذج.
يمكن إضافة العناصر إلى محرر gazebo بطريقة أبسط من علامة التبويب داخل محرر insert:

الآن دعونا نرى ما يراه الروبوت.
بدون إغلاق المحطتين السابقتين ، قم بتشغيل rviz مع وصف الروبوت:
roslaunch rosbots_description rviz.launch
وإضافة عرض جديد يسمى "صورة" فيه:

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

الآن دعونا نضيف IMU إلى النموذج.
IMU (جيروسكوب)
تشبه عملية إضافة imu إضافة كاميرا.
أولا ، فتح rosbots.gazebo.xacro وجعل
قانون <gazebo> <plugin name="gazebo_ros_imu_controller" filename="libgazebo_ros_imu.so"> <topicName>imu/data</topicName> <serviceName>imu/service</serviceName> <bodyName>base_link</bodyName> <gaussianNoise>0</gaussianNoise> <rpyOffsets>0 0 0</rpyOffsets> <updateRate>30.0</updateRate> <alwaysOn>true</alwaysOn> <gaussianNoise>0</gaussianNoise> </plugin> </gazebo>
سنضيف هذا الرمز ، وكذلك رمز الكاميرا المضافة ، داخل العلامة
<robot></robot>
نظرًا لأنه ليس من الصعب تخمين هذا الرمز ، فإنه سينشر البيانات في الموضوع / imu / data.
الآن ، إذا قمت بإعادة وضع نموذج الروبوت في أكشاك وقمت بتنفيذ الأمر:
rostopic list
في المحطة المجاورة ، يمكنك مشاهدة الموضوع ببيانات imu وغيرها:

يمكنك أيضًا إلقاء نظرة على ما ينشره عن طريق تشغيل الأمر:
rostopic echo /imu/data -n1

باختصار ، تنشر imu المعلومات التالية:
- الاتجاه: اتجاه الروبوت على طول المحاور x و y و z و w.
- angular_velocity: السرعة الزاوية للروبوت.
- linear_acceleration: التسارع الخطي.
كان هناك لمسة صغيرة
.
إضافة إلى rosbots.gazebo.xacro كل شيء هو أيضا ضمن العلامة
قانون <gazebo reference="wheel_left_link"> <mu1>1.0</mu1> <mu2>1.0</mu2> <kp>1000000.0</kp> <kd>100.0</kd> <minDepth>0.001</minDepth> <maxVel>1.0</maxVel> </gazebo> <gazebo reference="wheel_right_link"> <mu1>1.0</mu1> <mu2>1.0</mu2> <kp>1000000.0</kp> <kd>100.0</kd> <minDepth>0.001</minDepth> <maxVel>1.0</maxVel> </gazebo> <gazebo reference="base_link"> <material>Gazebo/Blue</material> <mu1>0.3</mu1> <mu2>0.3</mu2> <sensor type="contact" name="bumpers"> <always_on>1</always_on> <update_rate>50.0</update_rate> <visualize>true</visualize> <contact> <collision>base_footprint_collision_base_link</collision> </contact> </sensor> </gazebo> <gazebo reference="camera_link"> <mu1>0.2</mu1> <mu2>0.2</mu2> </gazebo>
سيحدد هذا الرمز معلمات إضافية للروبوت: معاملات الاحتكاك للعجلات والألوان في أكشاك المراقبة ومستشعر التلامس. سيتم تشغيل مستشعر التلامس مباشرةً بعد أن يلمس المصد الآلي العائق.
أعد تشغيل gazebo الآن ، ضع النموذج ، وفي rviz أضف imu display كما كان من قبل ، أضف العرض باستخدام الكاميرا:

إذا سارت الأمور على ما يرام ، فسنرى أن imu ينشر في الموضوع.
في الختام ، سنتحكم في الروبوت في المحاكاة ونرى كيف تتغير البيانات باستخدام imu:
المحطة الأولى:
roslaunch gazebo_ros empty_world.launch
2:
roslaunch rosbots_description spawn.launch
roslaunch rosbots_description rviz.launch
3:
rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/part2_cmr/cmd_vel
الأخطاء المحتملة أثناء العملية :
1. لا يظهر نموذج الروبوت في شرفة المراقبة (الحزمة [rosbots_description] لا تحتوي على مسار) - أغلق شرفة المراقبة ، وقم بتنفيذ devel / setup.bash المصدر في الجهاز ، وأعد تشغيل شرفة المراقبة.
2.
gzserver: /build/ogre-1.9-mqY1wq/ogre-1.9-1.9.0+dfsg1/OgreMain/src/OgreRenderSystem.cpp:546: virtual void Ogre::RenderSystem::setDepthBufferFor(Ogre::RenderTarget*): Assertion `bAttached && "A new DepthBuffer for a RenderTarget was created, but after creation" "it says it's incompatible with that RT"' failed. Aborted (core dumped)
حل ممكن (لم يتم اختباره):
https://bitbucket.org/osrf/gazebo/issues/1837/vmware-rendering-z-ordering-appears-random