Posting dalam seri:
8. Kami mengontrol dari ponsel-ROS Control, GPS-node7. Lokalisasi robot: gmapping, AMCL, titik referensi pada peta kamar6. Odometri dengan enkoder roda, peta ruang, lidar5. Kami bekerja di rviz dan gazebo: xacro, sensor baru.4. Buat simulasi robot menggunakan editor rviz dan gazebo.3. Akselerasi, ganti kamera, perbaiki gaya berjalan2. Perangkat Lunak1. BesiKelanjutan dari serangkaian artikel tentang cara membuat robot kecil. Kali ini kita akan berbicara tentang membuat salinan robot dalam simulasi, yang ditawarkan oleh lingkungan ROS visual rviz dan gazebo (selanjutnya disebut sebagai "editor"). Pekerjaan di editor akan dilakukan pada mesin virtual, gambar yang sebelumnya disediakan untuk mengunduh
gambar . Karena kita berbicara tentang simulasi, membangun model, kereta robot itu sendiri tidak diperlukan.

Posting sebelumnya dalam seri:
1.
Bagian 32.
Bagian 23.
Bagian 1Membuat file urdf dasar
Secara umum, proses pembuatan robot dengan cara yang disederhanakan biasanya terdiri dari tahapan berikut:
1. Membuat model robot.
2. Menguji model dalam simulasi.
3. Membuat model robot nyata.
4. Menguji model nyata.
Bekerja dengan editor ROS, yang memberikan peluang besar baik untuk membangun model dan pengujian mereka di dunia virtual, kita harus mengakui bahwa model robot nyata tidak selalu berperilaku sama dengan saudara-saudara mereka yang tidak berwujud. Dan di sini waktu untuk bekerja dengan model di dunia virtual ditambahkan ke waktu yang dibutuhkan untuk menyelesaikan model nyata.
Hadiah waktu seperti itu, seperti yang dikatakan oleh satu orang terkenal, tidak hanya mampu membayar semuanya.
Dalam hal ini, dalam posting sebelumnya urutan robotik terganggu: pertama, model robot yang sebenarnya telah dibuat. Sekarang kita akan berbicara tentang virtualisasi, jadi untuk berbicara.
Buat urdf
Untuk sepenuhnya menikmati simulasi di Gazebo dan menguji robot, Anda harus terlebih dahulu membuat file URDF untuk robot.
File URDF adalah sejenis kerangka kerangka di bidang visualisasi.
Sederhananya, file URDF adalah file yang menggambarkan robot.
Seperti yang dinyatakan sebelumnya, pekerjaan akan dilakukan menggunakan gambar VMWARE Workstation di mana ROS (Ubuntu 16.04, ROS-Kinetic) dan editor visual sudah diinstal. Oleh karena itu, semua tindakan dapat direproduksi dalam sistem ini.
Buat paket ROS yang disebut rosbots_description.
Untuk melakukan ini, Anda harus memasukkan folder dengan catkin_ws / src dan jalankan perintah untuk membuat paket di ROS:
roscd; cd ..; cd src; catkin_create_pkg rosbots_description rospy
* Jika saat menjalankan perintah roscd; cd ..; cd src; Jika Anda tidak masuk ke catkin_ws, maka mungkin Anda memiliki beberapa lingkungan jenis ini. Untuk mengaktifkan yang diperlukan, buka folder catkin_ws dan jalankan perintah: source devel / setup.bash. Agar tidak tersesat, jika Anda bekerja dengan suatu gambar, Anda dapat membuka folder ini dari root: cd ~; cd catkin_ws.
Jika semuanya berjalan dengan baik, maka folder rosbots_description akan dibuat.
Mengapa begitu sulit dan tidak mudah untuk hanya membuat folder di catkin_ws / src secara manual? Dan apa jenis rospy itu?
Anda dapat secara manual membuat folder, tetapi Anda juga harus secara manual menulis dua file lagi yang bekerja dengan ROS: CMakeLists.txt dan package.xml.
Mereka hadir di folder setelah pembuatan:

ROS mereka buat sendiri. Sementara kita tidak akan memikirkan isinya.
rospy di akhir perintah berarti membuat dependensi, mendukung python.
Pindah.
Di dalam paket rosbots_description yang baru dibuat, buat folder urdf, dan di dalamnya file rosbots.xacro.
roscd rosbots_description mkdir urdf; cd urdf; touch rosbots.xacro chmod +x rosbots.xacro
Keindahan sistem ROS adalah di mana folder sistem Anda tidak akan ditemukan, Anda dapat langsung mencapai target dengan hanya mengetik namanya dengan perintah roscd di awal baris.
Sekarang masukkan kode berikut dalam file yang baru dibuat:
rosbots.xacro <?xml version="1.0" encoding="utf-8"?> <robot name="rosbots" xmlns:xacro="http://www.ros.org/wiki/xacro"> <link name="base_footprint"/> <joint name="base_joint" type="fixed"> <origin xyz="0 0 0.05" rpy="0 0 0" /> <parent link="base_footprint"/> <child link="base_link" /> </joint> <link name="base_link"> <visual> <geometry> <mesh filename="package://rosbots_description/meshes/base.dae"/> </geometry> <origin xyz="-0.52 -0.4 0.43" rpy="0 0 0"/> </visual> <collision> <geometry> <mesh filename="package://rosbots_description/meshes/base.dae"/> </geometry> <origin xyz="-0.52 -0.4 0.43" rpy="0 0 0"/> </collision> <inertial> <origin xyz="0.0 0 0."/> <mass value="0.5"/> <inertia ixx="0.01" ixy="0.0" ixz="0.0" iyy="0.01" iyz="0.0" izz="0.03" /> </inertial> </link> <joint name="second_level_joint" type="fixed"> <origin xyz="0 0 0.68" rpy="0 0 0" /> <parent link="base_link"/> <child link="base_second_link" /> </joint> <link name="base_second_link"> <visual> <geometry> <mesh filename="package://rosbots_description/meshes/base.dae"/> </geometry> <origin xyz="-0.52 -0.4 0.0" rpy="0 0 0"/> </visual> <collision> <geometry> <mesh filename="package://rosbots_description/meshes/base.dae"/> </geometry> <origin xyz="-0.52 -0.4 0.0" rpy="0 0 0"/> </collision> <!--inertial> <origin xyz="0.01 0 0.7"/> <mass value="1.0"/> <inertia ixx="0.01" ixy="0.0" ixz="0.0" iyy="0.01" iyz="0.0" izz="0.03" /> </inertial--> </link> <joint name="mcu_joint" type="fixed"> <origin xyz="0.02 0.12 0.73" rpy="0 0 0" /> <parent link="base_link"/> <child link="mcu_link" /> </joint> <link name="mcu_link"> <visual> <geometry> <mesh filename="package://rosbots_description/meshes/rasp.dae" scale="0.14 0.14 0.14"/> </geometry> <origin xyz="0.9 -1.25 0" rpy="0 0 1.57"/> </visual> <collision> <geometry> <mesh filename="package://rosbots_description/meshes/rasp.dae" scale="0.14 0.14 0.14"/> </geometry> <origin xyz="0.9 -1.25 0" rpy="0 0 1.57"/> </collision> <!-- inertial> <origin xyz="0.01 0 0"/> <mass value="1.0"/> <inertia ixx="0.019995" ixy="0.0" ixz="0.0" iyy="0.019995" iyz="0.0" izz="0.03675" /> </inertial--> </link> <joint name="mcu_joint_1" type="fixed"> <origin xyz="0.02 0.12 0.83" rpy="0 0 0" /> <parent link="base_link"/> <child link="mcu_link_1" /> </joint> <link name="mcu_link_1"> <visual> <geometry> <mesh filename="package://rosbots_description/meshes/rasp.dae" scale="0.14 0.14 0.14"/> </geometry> <origin xyz="0.9 -1.25 0" rpy="0 0 1.57"/> </visual> <collision> <geometry> <mesh filename="package://rosbots_description/meshes/rasp.dae" scale="0.14 0.14 0.14"/> </geometry> <origin xyz="0.9 -1.25 0" rpy="0 0 1.57"/> </collision> <!-- inertial> <origin xyz="0.01 0 0"/> <mass value="1.0"/> <inertia ixx="0.019995" ixy="0.0" ixz="0.0" iyy="0.019995" iyz="0.0" izz="0.03675" /> </inertial--> </link> <joint name="stand_mcu1_joint" type="fixed"> <origin xyz="0.02 0.25 0.78" rpy="0 0 1.57" /> <parent link="base_link"/> <child link="stand_mcu1_link" /> </joint> <link name="stand_mcu1_link"> <visual> <geometry> <cylinder length="0.1" radius="0.01"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </visual> <collision> <geometry> <cylinder length="0.1" radius="0.01"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </collision> </link> <joint name="stand_mcu2_joint" type="fixed"> <origin xyz="0.02 -0.1125 0.78" rpy="0 0 1.57" /> <parent link="base_link"/> <child link="stand_mcu2_link" /> </joint> <link name="stand_mcu2_link"> <visual> <geometry> <cylinder length="0.1" radius="0.01"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </visual> <collision> <geometry> <cylinder length="0.1" radius="0.01"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </collision> </link> <joint name="stand_mcu3_joint" type="fixed"> <origin xyz="0.25 0.25 0.78" rpy="0 0 1.57" /> <parent link="base_link"/> <child link="stand_mcu3_link" /> </joint> <link name="stand_mcu3_link"> <visual> <geometry> <cylinder length="0.1" radius="0.01"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </visual> <collision> <geometry> <cylinder length="0.1" radius="0.01"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </collision> </link> <joint name="stand_mcu4_joint" type="fixed"> <origin xyz="0.25 -0.1125 0.78" rpy="0 0 1.57" /> <parent link="base_link"/> <child link="stand_mcu4_link" /> </joint> <link name="stand_mcu4_link"> <visual> <geometry> <cylinder length="0.1" radius="0.01"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </visual> <collision> <geometry> <cylinder length="0.1" radius="0.01"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </collision> </link> <joint name="batery_joint" type="fixed"> <origin xyz="1.2 0.2 0.43" rpy="0 0 1.57" /> <parent link="base_link"/> <child link="batery_link" /> </joint> <link name="batery_link"> <visual> <geometry> <mesh filename="package://rosbots_description/meshes/battery.dae" scale="13.0 6.0 6.0"/> </geometry> <origin xyz="0 4.5 0.05" rpy="1.57 0 1.57"/> </visual> <collision> <geometry> <mesh filename="package://rosbots_description/meshes/battery.dae" scale="13.0 6.0 6.0"/> </geometry> <origin xyz="0 4.5 0.05" rpy="1.57 0 1.57"/> </collision> <!-- inertial> <origin xyz="0.01 0 0"/> <mass value="1.0"/> <inertia ixx="0.01" ixy="0.0" ixz="0.0" iyy="0.01" iyz="0.0" izz="0.03" /> </inertial--> </link> <joint name="stand_1_joint" type="fixed"> <origin xyz="0.5 0.4125 0.58" rpy="0 0 1.57" /> <parent link="base_link"/> <child link="stand_1_link" /> </joint> <link name="stand_1_link"> <visual> <geometry> <cylinder length="0.20" radius="0.03"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </visual> <collision> <geometry> <cylinder length="0.20" radius="0.03"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </collision> <!--inertial> <origin xyz="0.0 0 0"/> <mass value="1.0"/> <inertia ixx="0.019995" ixy="0.0" ixz="0.0" iyy="0.019995" iyz="0.0" izz="0.03675" /> </inertial--> </link> <joint name="stand_2_joint" type="fixed"> <origin xyz="0.5 -0.2625 0.58" rpy="0 0 1.57" /> <parent link="base_link"/> <child link="stand_2_link" /> </joint> <link name="stand_2_link"> <visual> <geometry> <cylinder length="0.20" radius="0.03"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </visual> <collision> <geometry> <cylinder length="0.20" radius="0.03"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </collision> <!--inertial> <origin xyz="0.0 0 0"/> <mass value="1.0"/> <inertia ixx="0.019995" ixy="0.0" ixz="0.0" iyy="0.019995" iyz="0.0" izz="0.03675" /> </inertial--> </link> <joint name="wheel_left_joint" type="continuous"> <parent link="base_link"/> <child link="wheel_left_link"/> <origin xyz="0.15 0.4125 0.30" rpy="-1.57 0 0"/> <axis xyz="0 0 1"/> </joint> <link name="wheel_left_link"> <collision> <geometry> <cylinder length="0.20" radius="0.23"/> </geometry> <origin rpy="0.0 0.0 0" xyz="0 0 0.1"/> </collision> <visual name="visual"> <geometry> <!-- cylinder length="0.0206" radius="0.0550"/--> <!--cylinder length="0.20" radius="0.26"/--> <mesh filename="package://rosbots_description/meshes/wheel.dae" scale="8.0 8.0 8.0"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0"/> </visual> <inertial> <mass value="0.4" /> <origin xyz="0 0 0" /> <inertia ixx="0.001" ixy="0.0" ixz="0.0" iyy="0.001" iyz="0.0" izz="0.001" /> </inertial> </link> <joint name="wheel_right_joint" type="continuous"> <parent link="base_link"/> <child link="wheel_right_link"/> <origin xyz="0.15 -0.5625 0.30" rpy="-1.57 0 0"/> <axis xyz="0 0 1"/> </joint> <link name="wheel_right_link"> <collision> <geometry> <cylinder length="0.20" radius="0.23"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.195"/> </collision> <visual name="visual"> <geometry> <!--cylinder length="0.20" radius="0.26"/--> <mesh filename="package://rosbots_description/meshes/wheel.dae" scale="8.0 8.0 8.0"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0"/> </visual> <inertial> <mass value="0.4" /> <origin xyz="0 0.0 0.3" /> <inertia ixx="0.001" ixy="0.0" ixz="0.0" iyy="0.001" iyz="0.0" izz="0.001" /> </inertial> </link> <joint name="caster_back_joint" type="fixed"> <parent link="base_link"/> <child link="caster_back_link"/> <origin xyz="-0.4 0.1 0.26" rpy="0 0 0"/> </joint> <link name="caster_back_link"> <collision> <geometry> <!-- cylinder length="0.05" radius="0.19"/--> <sphere radius="0.19"/> </geometry> <origin rpy="0 0 0" xyz="0 0 0"/> </collision> <visual> <geometry> <!--cylinder length="0.05" radius="0.19"/--> <sphere radius="0.19"/> </geometry> <origin rpy="0 0 0" xyz="0 0 0"/> </visual> <inertial> <mass value="0.1" /> <origin xyz="0 0 0" /> <inertia ixx="0.001023539" ixy="0.0" ixz="0.0" iyy="0.001023539" iyz="0.0" izz="0.001023539" /> </inertial> </link> <joint name="stand_3_joint" type="fixed"> <origin xyz="-0.4 0.4125 0.58" rpy="0 0 1.57" /> <parent link="base_link"/> <child link="stand_3_link" /> </joint> <link name="stand_3_link"> <visual> <geometry> <cylinder length="0.20" radius="0.03"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </visual> <collision> <geometry> <cylinder length="0.20" radius="0.03"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </collision> </link> <joint name="stand_4_joint" type="fixed"> <origin xyz="-0.4 -0.2625 0.58" rpy="0 0 1.57" /> <parent link="base_link"/> <child link="stand_4_link" /> </joint> <link name="stand_4_link"> <visual> <geometry> <cylinder length="0.20" radius="0.03"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </visual> <collision> <geometry> <cylinder length="0.20" radius="0.03"/> </geometry> <origin rpy="0.0 0 0" xyz="0 0 0.0"/> </collision> </link> </robot>
Jika kode tidak muncul, maka semua file dapat diunduh di akhir posting.
Untuk kode di atas, kita juga membutuhkan sel (meches), yang akan dimuat saat peluncuran paket.
Meches bisa diambil
di sinidan letakkan folder meches yang belum dibongkar di rosbots_description.
Jika Anda melihat kode secara detail, Anda bisa mengetahui bahwa ini adalah file xml standar yang terdiri dari blok:
- visual
- tabrakan
- inersia
Setiap blok menggambarkan bagiannya: visual adalah penampilan robot, tidak ada lagi, tabrakan dan inersia adalah fisika robot, bagaimana segala sesuatu akan berinteraksi dengan dunia luar - tabrakan, inersia.
sendi - elemen yang membantu menentukan pergerakan antara bagian-bagian robot (tautan). Misalnya, pergerakan roda (wheel) memengaruhi frame secara keseluruhan (chasis).
origin xyz adalah lokasi awal objek sepanjang sumbu x, y, z.
tautan induk dan tautan anak adalah tautan induk dan anak, yang masing-masing tumbuh dari apa.
Kehadiran tipe juga patut diperhatikan: type = "continuous", type = "fixed". Ini adalah definisi dari apa yang bisa dan tidak bisa diputar. Jadi roda kontinu. Dan, misalnya, batery_joint diperbaiki.
Lekukan dalam kode ini sangat berarti seperti dalam python, di mana Anda tidak dapat mengganggu tab dan spasi, jangan bawa. Tetapi untuk surga perfeksionis dan visibilitas, lebih baik memilikinya.
Kode di atas pada dasarnya adalah model robot.
Bekerja di rviz
Mari kita lihat apa yang terjadi.
Untuk melakukan ini, buat file startup yang akan menjalankan paket ROS.
Untuk ini, apa yang disebut file peluncuran digunakan dalam ROS. Inti dari file peluncuran adalah untuk memungkinkan peluncuran sebuah node, perintah atau beberapa node dengan satu perintah pendek tanpa perlu menentukan semua argumen dan lainnya di dalamnya.
Buat folder peluncuran di rosbots_description dengan file rviz.launch:
roscd rosbots_description mkdir launch; cd launch; touch rviz.launch
* Ini dan waktu berikutnya, tidak perlu lagi membuat paket ROS seperti yang dilakukan sebelumnya. Sekarang sistem itu sendiri akan "melihat" file di dalam paket. Karena itu, kami hanya membuat direktori.
Isi file dengan konten -
rviz.launch <?xml version="1.0"?> <launch> <param name="robot_description" command="cat '$(find rosbots_description)/urdf/rosbots.xacro'"/> <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher"> <param name="use_gui" value="False"/> </node> <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher"/> <node name="rviz" pkg="rviz" type="rviz" /> </launch>
Di sini Anda dapat melihat bahwa saat startup sistem akan mencari deskripsi model di rosbots.xacro.
Selanjutnya, ia akan meluncurkan 3 node: joint_state_publisher dari paket joint_state_publisher, robot_state_publisher dari robot_state_publisher, rviz dari rviz. type adalah tipe node, biasanya sesuai dengan file Python atau C dengan nama yang sama, tetapi ditentukan tanpa ekstensi.
Jalankan:
Di terminal 1, jalankan master ROS:
roscore
Yang ke-2:
roslaunch rosbots_description rviz.launch
* Jika terjadi kesalahan
ROS_MASTER_URI [http: //192.168.1 ....: 11311] host tidak disetel ke mesin ini
, maka Anda perlu memeriksa bashrc - di mana ip ROS berjalan:
nano ~/.bashrc
tentukan ip mesin virtual dalam file bashrc itu sendiri (misalnya, yang ini):
export ROS_MASTER_URI=http://192.168.1.114:11311
baca kembali bashrc lebih lanjut:
source ~/.bashrc
atau reboot.
**
Jika roslaunch masih belum mulai, maka Anda dapat mencoba untuk pergi ke folder catkin_ws dan menjalankan: source devel / setup.bash
Menyelam ke Rviz
Setelah perintah dieksekusi, editor Rviz memulai dan shell grafis terbuka.
Presentasi visual dapat bervariasi, tetapi secara umum tampilan akan kira-kira sebagai berikut:

Di sebelah kiri dalam kolom Tampilan, Anda dapat mengamati opsi tampilan untuk berbagai elemen yang berinteraksi dengan node ROS, di tengah - gambar robot, di sebelah kanan - kolom dengan tampilan kamera robot. Saya harus segera mengatakan bahwa lebih baik bekerja dengan mouse 3 roda dengan rviz, karena semua tombol mouse terlibat di sini. Dengan memegang kiri, Anda dapat memutar ruang di jendela dengan robot ditampilkan, memegang kanan - zoom in / zoom out, memegang kedua tombol - pindahkan ruang relatif ke robot.
Sebagian besar pekerjaan di editor dilakukan dalam dua kolom pertama: Menampilkan dan representasi visual dari robot.
Mari kita bekerja dengan tampilan robot
Mari kita pilih "Frame Tetap" - "tautan dasar" di baris:

Dan tambahkan Deskripsi Robot ke Layar:
Klik "Tambah" dan pilih "RobotModel" dalam daftar:

"
Sekarang di jendela simulasi Anda dapat mengamati robot yang direproduksi dari model rviz.xacro:

"
Bagus Dengan representasi visual, semuanya jelas. Sekarang Anda perlu memahami cara menjalankan simulasi, karena rviz hanyalah
visualisasi dari simulasi, tetapi bukan simulasi itu sendiri.
Artinya, fisika tidak berfungsi di sini.
Simulasi itu sendiri tinggal di editor bernama Gazebo.
Gazebo
Untuk menempatkan model yang dibuat di Gazebo, buat file peluncuran lain - spawn.launch di folder peluncuran proyek. Sekarang kami memiliki 2 file peluncuran!
spawn.launch <?xml version="1.0" encoding="UTF-8"?> <launch> <param name="robot_description" command="cat '$(find rosbots_description)/urdf/rosbots.xacro'" /> <arg name="x" default="0"/> <arg name="y" default="0"/> <arg name="z" default="0.5"/> <node name="mybot_spawn" pkg="gazebo_ros" type="spawn_model" output="screen" args="-urdf -param robot_description -model rosbots -x $(arg x) -y $(arg y) -z $(arg z)" /> </launch>
Di sini kita juga membaca model, kemudian dengan argumen kita melewati lokasinya di ruang sepanjang sumbu x, y, z. Selanjutnya, jalankan hanya satu node - mybot_spawn dari paket gazebo_ros.
* Tidak perlu menginstal ulang paket yang disebutkan di atas. Jika diinginkan, Anda dapat melihat paket-paket ini dengan perintah yang sama: roscd. Misalnya roscd gazebo_ros.
Sekarang hentikan Ros-master di terminal 1:
CTRL+C
Dan jalankan editor Gazebo:
roslaunch gazebo_ros empty_world.launch
Di terminal 2, jalankan file yang baru dibuat:
roslaunch rosbots_description spawn.launch
Sekarang kita melihat robot kita dalam simulasi editor Gazebo:

* Jika Anda memiliki kesalahan:
Waiting for service /gazebo/spawn_urdf_model
Ini berarti Anda meluncurkan model tanpa terlebih dahulu memulai Gazebo, melanggar urutan peluncuran.
Mari kita pergi ke simulasi gazebo.
Sekarang tambahkan kode berikut ke rosbots.xacro sebelum tag penutup:
kode <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>
Simulator Gazebo tidak dapat ditutup saat mengedit.
Sekarang hapus model dari editor Gazebo:
rosservice call /gazebo/delete_model "model_name: 'rosbots'"
Atau cukup restart editor.
* Gazebo rewel dalam mesin virtual, jadi bahkan setelah menutupnya terkadang memaafkan CTRL + C tambahan di terminal.
Ganti model di Gazebo setelah diedit:
roslaunch rosbots_description spawn.launch
Jika sekarang Anda melihat daftar topik ROS, Anda dapat melihat bahwa di antara mereka ada
/part2_cmr/cmd_vel

Sekarang mari kita coba mengendalikan robot dalam simulasi dengan menjalankan kontrol di terminal terpisah:
rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/part2_cmr/cmd_vel
Berada di jendela dengan kontrol berjalan dan menekan tombol "i", "l", "j", "k", "," di jendela terminal, Anda dapat mengamati pergerakan robot dalam simulasi editor Gazebo:

Kode -
unduh .
Untuk dilanjutkan.