Troli truk ROS. Bagian 5. Bekerja di rviz dan gazebo: xacro, sensor baru

Posting dalam seri:
8. Kami mengontrol dari ponsel-ROS Control, GPS-node
7. Lokalisasi robot: gmapping, AMCL, titik referensi pada peta kamar
6. Odometri dengan enkoder roda, peta ruang, lidar
5. Kami bekerja di rviz dan gazebo: xacro, sensor baru.
4. Buat simulasi robot menggunakan editor rviz dan gazebo.
3. Akselerasi, ganti kamera, perbaiki gaya berjalan
2. Perangkat Lunak
1. Besi

Terakhir kali, tujuan-tujuan berikut tercapai:

  • memvisualisasikan robot dengan membuat file xacro yang berisi urdf-description dari robot;
  • buat dua file peluncuran, salah satunya memungkinkan Anda untuk menempatkan robot di editor-simulator Gazebo;
  • mengontrol robot di simulator Gazebo dari keyboard.

Dalam posting ini, kami akan mengatur proyek dalam bentuk modul xacro sehingga menjadi lebih mudah dibaca (sebelumnya, untuk kejelasan, kami mendorong seluruh deskripsi menjadi satu file xacro). Tambahkan kamera video virtual dan imu. Mari kita lihat bagaimana cara menambahkan gazebo ke benda asing di dunia di sekitar kita.

Pertama, periksa apakah terminal bernavigasi melalui sistem ROS menggunakan perintah roscd:

roscd rosbots_description/launch 

Jika tidak berhasil, buka folder dengan catkin_ws dan jalankan perintah:

 source devel/setup.bash 

Sekarang mari kita pergi ke folder dengan deskripsi robot:

 roscd rosbots_description/launch 

Dalam file spawn.launch yang dibuat sebelumnya, yang berikut ini ditunjukkan:

 <param name="robot_description" command="cat '$(find rosbots_description)/urdf/rosbots.xacro'" /> 

Perintah cat digunakan untuk memuat konten rosbots.xacro ke parameter robot_description.

Untuk memanfaatkan format perintah xacro sepenuhnya, kode harus sedikit diperbaiki. Ganti baris di atas dengan yang berikut ini:

 <param name="robot_description" command="$(find xacro)/xacro.py '$(find rosbots_description)/urdf/rosbots.xacro'" /> 

Sekarang sistem akan menggunakan xacro.py untuk mengeksekusi rosbots.xacro.

Perubahan yang sama akan diperlukan untuk file peluncuran kedua - rviz.launch.

Ubah

 <param name="robot_description" command="cat '$(find rosbots_description)/urdf/rosbots.xacro'" /> 

pada

 <param name="robot_description" command="$(find xacro)/xacro.py '$(find rosbots_description)/urdf/rosbots.xacro'"/> 

Periksa apakah semuanya berfungsi dengan sintaks baru.

Pertama, lihat model di editor rviz:

 roslaunch rosbots_description rviz.launch 

Lalu, tutup rviz, check in gazebo.

Terminal 1:

 roslaunch gazebo_ros empty_world.launch 

2:

 roslaunch rosbots_description spawn.launch 

* Anda dapat melihat pesan-pesannya
warna kuning


 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 


Mereka tidak memberikan cuaca, sehingga Anda tidak bisa memperhatikan.

Jadi, semuanya berfungsi seperti sebelumnya, hanya sekarang format xacro digunakan.
Apa yang dia berikan? Format ini memungkinkan Anda untuk mengatur ulang kode. Seiring pertumbuhan proyek, ini akan memungkinkan orientasi yang lebih baik di masa depan.

Bekerja dengan xacro


Sekarang saatnya untuk membagi rosbots.xacro menjadi bagian-bagian penyusunnya dan memanfaatkan xacro.

Pindahkan segala sesuatu tentang editor gazebo (tag gazebo) dari rosbots.xacro ke file baru.
Buat file rosbots.gazebo.xacro di folder urdf:

 nano rosbots.gazebo.xacro 

Dan taruh kodenya di sana:

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> 


Kode yang sama di dalam tag
 <gazebo> </gazebo> 
hapus dari file rosbots.xacro.

Sekarang kita akan melampirkan file yang baru dibuat ke rosbots.xacro. Dari suatu tempat, informasi yang sama tentang komponen gazebo dari rosbots.xacro harus diterima!

Dengan demikian, tambahkan ke rosbots.xacro:

 <xacro:include filename="$(find rosbots_description)/urdf/rosbots.gazebo.xacro" /> 

Masukkan baris ini setelah baris dengan tag
 <robot> 
. Sekarang awal file terlihat seperti ini:

 <robot name="rosbots" xmlns:xacro="http://www.ros.org/wiki/xacro"> <xacro:include filename="$(find rosbots_description)/urdf/rosbots.gazebo.xacro" /> 

Periksa lagi apakah semuanya berfungsi dalam format baru:

Terminal 1:

 roslaunch gazebo_ros empty_world.launch 

2:

 roslaunch rosbots_description spawn.launch 

Jadi, bagi pengguna, semuanya tetap pada tempatnya dalam hal meluncurkan model dalam simulasi, perintahnya sama.

Tambahkan sensor baru


Sekarang, setelah proyek memiliki tampilan yang kurang lebih terstruktur, kami akan memasang sensor tambahan.

Agar tidak mengacaukan robot dengan "body kit", kami hanya menambahkan dua sensor: kamera dan imu (modul pengukuran inersia atau giroskop).

Untuk keperluan ini, Anda harus memperbaiki file rosbots.xacro dan rosbots.gazebo.xacro.

Mari kita mulai dengan kamera dan file rosbots.xacro. Agar semuanya berfungsi, untuk sensor Anda perlu menambahkan:

  • komunikasi (tautan). Itu akan diwakili oleh file dae.
  • joint, yang akan menempelkan kamera ke badan robot.

Di file lain - rosbots.gazebo.xacro - kami akan menambahkan:

  • sebuah plugin yang akan mendeteksi tautan yang dibuat di atas sebagai sensor.

Kami menempatkannya di rosbots.xacro di dalam tag (untuk kenyamanan, Anda dapat menambahkannya di akhir):

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> 


Kode di atas menambahkan tautan dan sambungan ke kamera kami, memungkinkannya divisualisasikan.

Lihat ini.

Terminal 1:

 roslaunch gazebo_ros empty_world.launch 

2:

 roslaunch rosbots_description spawn.launch 

Jika semuanya benar, maka Anda dapat melihat kamera yang ditambahkan pada robot (putih):



Tampaknya semuanya sederhana. Namun, harus dipahami bahwa hanya visualisasi kamera yang telah ditambahkan. Bagaimana kamera ini akan berperilaku di dunia hal-hal fisik belum jelas. Perilakunya tidak terdefinisi. Kamera belum dapat mengambil foto atau merekam video.

Ini giliran bekerja pada file dengan gazebo.

Tambahkan ke

rosbots.gazebo.xacro
tag dalam

 <robot> </robot> 

tambahkan:

 <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> 


Karena mudah ditebak dalam kode, kami menentukan parameter kamera:

  • update_rate: seberapa sering data akan tiba
  • lebar / tinggi: resolusi gambar. Dalam hal ini, 320x240.
  • format: format video (R8G8B8).
  • imageTopicName: nama topik tempat data akan dikirim
  • frameName: tautan-tautan ke mana kamera akan dilampirkan.

Sekarang semuanya siap untuk memvisualisasikan kamera dan simulasinya.

Jika sekarang Anda me-restart simulasi dan melihat daftar topik, Anda dapat melihat bahwa di antara mereka topik yang dihasilkan oleh kamera telah ditambahkan:

 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 

Ada banyak topik! Tetapi, sebagai suatu peraturan, tidak semuanya sering digunakan kecuali tiga yang pertama.

Gambar di rviz dari gazebo simulator


* di sini perlu untuk membuat reservasi bahwa dalam konfigurasi saat ini gambar untuk gazebo VMWare crash ketika Anda mencoba untuk mulai siaran ke rviz dari kamera video virtual. Solusi yang mungkin ditunjukkan di akhir posting di bagian kesalahan.

Untuk kejelasan, ketika bekerja dengan kamera dalam simulasi, jalankan rviz dan letakkan beberapa objek di depan robot.

Untuk melakukan ini, pertama Anda perlu objek itu sendiri, yang akan ditambahkan ke gazebo.

Unduh file object.urdf dan masukkan ke ~ / catkin_ws / src /

Mari kita jalankan.

Terminal 1:

 roslaunch gazebo_ros empty_world.launch 

2 (tempatkan model):

 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 

Dalam simulasi kita mendapatkan gambar berikut:



Model robot dan pos yang juga ditambahkan sebagai model.

Item dapat ditambahkan ke editor gazebo dengan cara yang lebih sederhana dari tab di dalam editor insert:



Sekarang mari kita lihat apa yang dilihat robot.

Tanpa menutup dua terminal sebelumnya, jalankan rviz dengan deskripsi robot:

 roslaunch rosbots_description rviz.launch 

Dan tambahkan Tampilan baru yang disebut "Gambar" di dalamnya:



Tampilan baru dengan gambar kamera akan muncul dan ... editor gazebo akan terbang keluar.

Sayangnya, ketika bekerja pada mesin virtual dengan gambar VMWare, menambahkan siaran dari kamera virtual menghasilkan kesalahan.

Jika pekerjaan dilakukan bukan pada mesin virtual, tetapi pada mesin nyata, maka kita akan mendapatkan gambar dari kamera virtual di gazebo dengan gambar gambar kolom:



Sekarang mari kita tambahkan IMU ke model.

IMU (giroskop)


Proses menambahkan imu mirip dengan menambahkan kamera.

Pertama, buka rosbots.gazebo.xacro dan buat

kode
 <gazebo> <plugin name="gazebo_ros_imu_controller" filename="libgazebo_ros_imu.so"> <!-- <robotNamespace></robotNamespace> --> <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> 


Kami akan menambahkan kode ini, serta kode untuk kamera yang ditambahkan, di dalam tag

  <robot></robot> 

Karena tidak sulit untuk menebak dari kode, itu akan menerbitkan data dalam topik / imu / data.

Sekarang, jika Anda menempatkan kembali model robot di gazebo dan menjalankan perintah: rostopic list di terminal tetangga, Anda dapat melihat topik dengan data imu antara lain:



Anda juga dapat melihat apa yang dia terbitkan dengan menjalankan perintah:

 rostopic echo /imu/data -n1 



Singkatnya, imu menerbitkan informasi berikut:

  • orientasi: orientasi robot sepanjang sumbu x, y, z, dan w.
  • angular_velocity: kecepatan sudut robot.
  • linear_acceleration: akselerasi linear.

Ada sedikit sentuhan

.
Tambahkan ke rosbots.gazebo.xacro semuanya juga ada dalam tag

kode
 <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> 


Kode ini akan menentukan parameter tambahan robot: koefisien gesekan untuk roda, warna dalam gazebo, sensor kontak. Sensor kontak akan dipicu segera setelah bumper robot menyentuh rintangan.

Sekarang restart gazebo, tempatkan model, dan di rviz tambahkan tampilan imu seperti sebelumnya, tambahkan tampilan dengan kamera:



Jika semuanya berjalan dengan baik, maka kita akan melihat bahwa imu memposting di topik.

Sebagai kesimpulan, kami akan mengontrol robot dalam simulasi dan melihat bagaimana data berubah dengan imu:

Terminal 1:

 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 


Kemungkinan kesalahan selama operasi :

1. Model robot tidak muncul di gazebo (Paket [rosbots_description] tidak memiliki path) - tutup gazebo, jalankan source devel / setup.bash di terminal, restart gazebo.
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) 

Kemungkinan solusi (tidak diuji):

 https://bitbucket.org/osrf/gazebo/issues/1837/vmware-rendering-z-ordering-appears-random 

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


All Articles