文章目录
引言
这是一段比较完整的教程。将分为四篇文章四部分内容:
- 搭建gazebo仿真环境,并且在虚拟环境中运行slam算法,保存环境地图
- 使用map_merge,多个机器人同时slam建图
- 使用map_server打开保存的地图,并且使acml定位和move_base进行自主导航
- 使用explore_lite功能包实现机器人边自主导航,边构建地图
PS:文章内容不包括相应功能包的安装,使用的环境是melodic,如果有版本不一致,可能需要做小的修改
github
第一部分 搭建gazebo仿真环境
使用gazebo的building_editor搭建地图
- 打开building_editor
- 点击左侧的Wall,在白板上画出二维地图,就会自动生成三维地图了。如果希望构建更复杂,比如带坡度的地图,也可以使用三维建模软件设计后,导入到gazebo中这里就不认真介绍了
- 退出editor并点击save,建议拖动三维模型,使坐标原点在地图中,不然之后设置机器人出生点时会很不便利
- 最后退出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
可以看到机器人出生在了原点
使用rostopic list
、rqt_graph
、rosrun rqt_tf_tree rqt_tf_tree
等命令观察一下,以后调试可以经常使用这些东西进行观察
第三部分 启动SLAM
我在仓库中配置了gmapping和cartorgrapher算法的配置文件,这里只放最常用的gmapping算法的配置文件,看到终端开始打印数据,即开启成功。
<launch>
<arg name="ns" default="tb3_0"/>
<!-- Gmapping -->
<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,即将世界坐标系设置为地图坐标
我们可以看到,是gazebo这个环境直接给gmapping节点提供了scan这个雷达数据的topic
第四部分 使用键盘控制构建地图并保存
键盘控制机器人
使用命令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
保存构建的地图
保存下来有两个文件,一个是pgm文件,就是构建的地图,是一张0-255的灰度图。另一个yaml文件是描述地图的,resolution=0.05代表一个像素格0.05米,origin代表图片左下方像素点代表的坐标。
这样,我们第一课的任务就完成了。
文章出处登录后可见!