SLAM学习笔记——从零搭建完整的gazebo多机仿真SLAM(一)

文章目录

    • 引言
    • 第一部分 搭建gazebo仿真环境
      • 使用gazebo的building_editor搭建地图
      • 使用launch文件加载world文件
    • 第二部分 放入你的机器人
    • 第三部分 启动SLAM
    • 第四部分 使用键盘控制构建地图并保存
      • 键盘控制机器人
      • 保存地图

引言

这是一段比较完整的教程。将分为四篇文章四部分内容:

  • 搭建gazebo仿真环境,并且在虚拟环境中运行slam算法,保存环境地图
  • 使用map_merge,多个机器人同时slam建图
  • 使用map_server打开保存的地图,并且使acml定位和move_base进行自主导航
  • 使用explore_lite功能包实现机器人边自主导航,边构建地图
    PS:文章内容不包括相应功能包的安装,使用的环境是melodic,如果有版本不一致,可能需要做小的修改
    github

第一部分 搭建gazebo仿真环境

使用gazebo的building_editor搭建地图

  • 打开building_editor
    SLAM学习笔记——从零搭建完整的gazebo多机仿真SLAM(一)_第1张图片
  • 点击左侧的Wall,在白板上画出二维地图,就会自动生成三维地图了。如果希望构建更复杂,比如带坡度的地图,也可以使用三维建模软件设计后,导入到gazebo中这里就不认真介绍了
    SLAM学习笔记——从零搭建完整的gazebo多机仿真SLAM(一)_第2张图片
  • 退出editor并点击save,建议拖动三维模型,使坐标原点在地图中,不然之后设置机器人出生点时会很不便利
    SLAM学习笔记——从零搭建完整的gazebo多机仿真SLAM(一)_第3张图片
  • 最后退出gazebo并保存地图为xxx.world文件,如果使用虚拟机,会遇到保存界面卡住的情况,这时候最小化窗口再打开可以解决问题。

使用launch文件加载world文件

  • 先创建功能包,我取名为gazebo_tutorials
  • 添加两个文件夹launch和world,将你刚刚保存的world文件保存在world文件夹中
  • 创建launch文件,我将它取名为create_world.launch
<launch>
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
     <arg name="world_name" value="$(find gazebo_tutorials)/world/maze.world"/>
    <arg name="paused" value="false"/>
    <arg name="use_sim_time" value="true"/>
    <arg name="gui" value="true"/>
    <arg name="headless" value="false"/>
    <arg name="debug" value="false"/>
  include>  
launch>

catkin_make编译一下,使用命令roslaunch gazebo_tutorials create_world.launch 即可启动仿真环境

第二部分 放入你的机器人

你可以为自己的机器人建模,导出urdf模型,但是为了通用性,我们这里直接使用turtlebot3的模型。
使用turtlebot我参考了/opt/ros/melodic/share/turtlebot3_gazebo文件夹下的文件,里面包含了发行包的示例文件,你去网上搜gazebo仿真都是让你直接运行了这些文件,要学会自己看这些文件,模仿,然后就可以使用到自己的项目中了。

  • 写一个名为place_robot.launch的文件放置机器人,TURTLEBOT3_MODEL是你自己设置的turtlebot种类,你可以使用export TURTLEBOT3_MODEL=buger设置机器人种类为buger,对应了burger的模型
<launch>
    
  <arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>
  <arg name="robot_name"  default="tb3_0"/>
  <arg name="robot_x_pos" default="0.0"/>
  <arg name="robot_y_pos" default="0.0"/>
  <arg name="robot_z_pos" default=" 0.0"/>
  <arg name="robot_yaw"   default=" 0.0"/>
  
  <group ns = "$(arg robot_name)">
    
    <param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro" />
    
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen">
      <param name="publish_frequency" type="double" value="50.0" />
      <param name="tf_prefix" value="$(arg robot_name)" />
    node>
    <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-urdf -model $(arg robot_name) -x $(arg robot_x_pos) -y $(arg robot_y_pos) -z $(arg robot_z_pos) -Y $(arg robot_yaw) -param robot_description" />
  group>    

launch>

roslaunch gazebo_tutorials place_robot.launch可以看到机器人出生在了原点
SLAM学习笔记——从零搭建完整的gazebo多机仿真SLAM(一)_第4张图片
使用rostopic listrqt_graphrosrun rqt_tf_tree rqt_tf_tree 等命令观察一下,以后调试可以经常使用这些东西进行观察
在这里插入图片描述
SLAM学习笔记——从零搭建完整的gazebo多机仿真SLAM(一)_第5张图片
SLAM学习笔记——从零搭建完整的gazebo多机仿真SLAM(一)_第6张图片
另外,我们可以使用roslaunch gazebo_tutials place_robot.launch robot_name:=tb3_1 robot_x_pos:=1.0命令创建不同位置的第二、三台机器人,我们到最后一篇再做这些事情,现在先保持一台机器人。

第三部分 启动SLAM

我在仓库中配置了gmapping和cartorgrapher算法的配置文件,这里只放最常用的gmapping算法的配置文件,看到终端开始打印数据,即开启成功。

<launch>
  <arg name="ns" default="tb3_0"/>
  
  <node pkg="gmapping" type="slam_gmapping" name="turtlebot3_slam_gmapping" output="screen" ns="$(arg ns)">
    <param name="base_frame" value="$(arg ns)/base_footprint"/>
    <param name="odom_frame" value="$(arg ns)/odom"/>
    <param name="map_frame"  value="$(arg ns)/map"/>
    <param name="map_update_interval" value="2.0"/>
    <param name="maxUrange" value="4.0"/>
    <param name="minimumScore" value="100"/>
    <param name="linearUpdate" value="0.2"/>
    <param name="angularUpdate" value="0.2"/>
    <param name="temporalUpdate" value="0.5"/>
    <param name="delta" value="0.05"/>
    <param name="lskip" value="0"/>
    <param name="particles" value="120"/>
    <param name="sigma" value="0.05"/>
    <param name="kernelSize" value="1"/>
    <param name="lstep" value="0.05"/>
    <param name="astep" value="0.05"/>
    <param name="iterations" value="5"/>
    <param name="lsigma" value="0.075"/>
    <param name="ogain" value="3.0"/>
    <param name="srr" value="0.01"/>
    <param name="srt" value="0.02"/>
    <param name="str" value="0.01"/>
    <param name="stt" value="0.02"/>
    <param name="resampleThreshold" value="0.5"/>
    <param name="xmin" value="-10.0"/>
    <param name="ymin" value="-10.0"/>
    <param name="xmax" value="10.0"/>
    <param name="ymax" value="10.0"/>
    <param name="llsamplerange" value="0.01"/>
    <param name="llsamplestep" value="0.01"/>
    <param name="lasamplerange" value="0.005"/>
    <param name="lasamplestep" value="0.005"/>
  node>
launch>

在终端运行rviz,点击左下角add,在by topic中找到map添加进去,即可看到构建的地图,rviz也可以保存配置,这里先不保存,等后面多台机器人的时候再详细讲,包括坐标的显示、坐标系的选择等。
fixed_frame选择为tb3_0/map,即将世界坐标系设置为地图坐标
SLAM学习笔记——从零搭建完整的gazebo多机仿真SLAM(一)_第7张图片
我们可以看到,是gazebo这个环境直接给gmapping节点提供了scan这个雷达数据的topic
SLAM学习笔记——从零搭建完整的gazebo多机仿真SLAM(一)_第8张图片

第四部分 使用键盘控制构建地图并保存

键盘控制机器人

使用命令ROS_NAMESPACE=tb3_0 rosrun teleop_twist_keyboard teleop_twist_keyboard.py 即可,没有这个控制包的可以去装一个,根据提示操作即可,如果机器人运动和你期望不一样,可以减慢机器人的速度再尝试。

保存地图

使用命令将ROS_NAMESPACE=tb3_0 rosrun map_server map_saver -f ~/catkin_ws/src/gazebo_tutorials/map/map保存构建的地图
SLAM学习笔记——从零搭建完整的gazebo多机仿真SLAM(一)_第9张图片
保存下来有两个文件,一个是pgm文件,就是构建的地图,是一张0-255的灰度图。另一个yaml文件是描述地图的,resolution=0.05代表一个像素格0.05米,origin代表图片左下方像素点代表的坐标。
这样,我们第一课的任务就完成了。

你可能感兴趣的:(SLAM,自动驾驶,人工智能,机器学习)