博文编辑中…

适用版本:ros-galactic

1. ROS2 安装 gazebo

默认安装的ros2是不包含gazebo的,首先我们安装gazebo11

1
sudo apt-get install ros-galactic-gazebo-*

后续我们会使用Cartographer进行SLAM,所以还需要安装Cartographer相关的功能包:

1
2
sudo apt install ros-galactic-cartographer
sudo apt install ros-galactic-cartographer-ros

接着安装Turtlebot3相关功能包:

1
2
sudo apt install ros-galactic-turtlebot3
sudo apt install ros-galactic-turtlebot3-simulations

2. 使用 gazebo 仿真

2.1 例程

配置gazebo的仿真模型路径:

1
$ export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:'ros2 pkg \prefix turtlebot3_gazebo \'/share/turtlebot3_gazebo/models/

启动仿真环境:

1
2
export TURTLEBOT3_MODEL=burger
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

运行SLAM功能:

1
2
export TURTLEBOT3_MODEL=burger
ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True

运行键盘控制节点:

1
2
export TURTLEBOT3_MODEL=burger
ros2 run turtlebot3_teleop teleop_keyboard

2.2 自定义的 urdf 小车

本节内容基本根据古月居老师的《ROS2入门21讲》整理归纳
本节使用的小车即古月居老师例程中的mbot,对于支撑轮的部分稍做了修改

2.2.1 需要修改的代码

古月居老师提供的mbot在移动时会产生漂移以及阻塞感,经分析后确定是支撑轮的问题,将原本固定的支撑轮修改为无限旋转后即可解决:

1
2
3
4
5
6
7
8
...
<joint name="${prefix}_caster_joint" type="continuous">
<origin xyz="${reflect*caster_joint_x} 0 ${-(base_length/2 + caster_radius)}" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="${prefix}_caster_link"/>
<axis xyz="0 1 0"/>
</joint>
...

2.2.2 几个关键点

(1)差速转向插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...
<plugin name="differential_drive_controller"
filename="libgazebo_ros_diff_drive.so">
<update_rate>30</update_rate>
<left_joint>left_wheel_joint</left_joint>
<right_joint>right_wheel_joint</right_joint>
<wheel_separation>${wheel_joint_y*2}</wheel_separation>
<wheel_diameter>${2*wheel_radius}</wheel_diameter>
<max_wheel_torque>20</max_wheel_torque>
<max_wheel_acceleration>1.0</max_wheel_acceleration>
<command_topic>cmd_vel</command_topic>
<publish_odom>true</publish_odom>
<publish_odom_tf>true</publish_odom_tf>
<publish_wheel_tf>true</publish_wheel_tf>
<odometry_topic>odom</odometry_topic>
<odometry_frame>odom</odometry_frame>
<robot_base_frame>base_footprint</robot_base_frame>
<odometry_source>1</odometry_source>
</plugin>
...

需要注意的是wheel_separation轮距参数应为两轮中心点的距离,wheel_diameter轮径应为轮子的直径。

附录

1
2
3
4
# gazebo 发布的 topic
gz topic -l

gz joint -m cart_front_steer -j wheel_front_left_steer_spin --vel-t 1

参考

  1. 《ROS2入门21讲》
  2. ROS2入门教程——30. 在Gazebo仿真环境中实现SLAM
  3. ROS虚拟仿真环境安装使用
  4. 【踩坑记录】Gazebo启动慢,画面卡“Preparing your world”