slam作为当今最火的导航技术,在各个领域都有广泛的应用,本文是利用Gmapping算法实现机器人自主完成导航和建图的实例,代码齐全、中文解释更加方便记忆,适合初学者快速入门学习;文件包中含有urdf文件、xacro文件、启动gazebo仿真环境的文件、启动各项节点的roslaunch文件、可视化rviz界面模拟仿真,即使没有实体机器人也可以在电脑上完成slam导航与建图。
1、slam导航实现的代码
<launch>
<param name="use_sim_time" value="true"/>
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
<remap from="scan" to="scan"/>
<param name="base_frame" value="base_footprint"/>
<!--底盘坐标系-->
<param name="odom_frame" value="odom"/>
<!--里程计坐标系-->
<param name="map_update_interval" value="5.0"/>
<param name="maxUrange" value="16.0"/>
<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="lskip" value="0"/>
<param name="srr" value="0.1"/>
<param name="srt" value="0.2"/>
<param name="str" value="0.1"/>
<param name="stt" value="0.2"/>
<param name="linearUpdate" value="1.0"/>
<param name="angularUpdate" value="0.5"/>
<param name="temporalUpdate" value="3.0"/>
<param name="resampleThreshold" value="0.5"/>
<param name="particles" value="30"/>
<param name="xmin" value="-50.0"/>
<param name="ymin" value="-50.0"/>
<param name="xmax" value="50.0"/>
<param name="ymax" value="50.0"/>
<param name="delta" value="0.05"/>
<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>
<node pkg="joint_state_publisher" name="joint_state_publisher" type="joint_state_publisher" />
<node pkg="robot_state_publisher" name="robot_state_publisher" type="robot_state_publisher" />
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find nav_car)/config/new_test.rviz"/>
</launch>
2、导航地图保存代码实现
<launch>
<arg name="filename" value="$(find nav_car)/map/map01" />
<node name="map_save" pkg="map_server" type="map_saver" args="-f $(arg filename)" />
</launch>
3、导航地图重现代码实现
<launch>
<arg name="map" default="map01.yaml" />
<node pkg="map_server" type="map_server" name="map_server" args="$(find nav_car)/map/map01.yaml" />
</launch>
4、gazebo仿真环境代码实现
<launch>
<param name="robot_description" command="$(find xacro)/xacro $(find new_gazebo)/urdf/car.urdf.xacro" />
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find new_gazebo)/worlds/new_map/box_house.world" />
</include>
<node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description" />
</launch>
5、路径规划代码实现
<launch>
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true">
<rosparam file="$(find nav_car)/param/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find nav_car)/param/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find nav_car)/param/local_costmap_params.yaml" command="load" />
<rosparam file="$(find nav_car)/param/global_costmap_params.yaml" command="load" />
<rosparam file="$(find nav_car)/param/base_local_planner_params.yaml" command="load" />
</node>
</launch>
6、仿真环境下机器人本体代码实现
<robot name="car">
<link name="base_footprint">
<visual>
<geometry>
<sphere radius="0.001" />
</geometry>
</visual>
</link>
<link name="base_link">
<visual>
<geometry>
<box size="0.4 0.2 0.1 " />
<origin xyz="0 0 0" rpy="0 0 0"/>
<material name="blue">
<color rgba="0 0.5 0.5 0.2"/>
</material>
</geometry>
</visual>
</link>
<joint name="base_link2base_footprint" type="fixed">
<parent link="base_footprint"/>
<child link="base_link"/>
<origin xyz="0 0 0.05"/>
</joint>
<link name="camera">
<visual>
<geometry>
<box size="0.01 0.02 0.015"/>
<origin xyz="0 0 0" rpy="0 0 0"/>
<material name="black">
<color rgba="0 0.2 0.9 0.4"/>
</material>
</geometry>
</visual>
</link>
<joint name="camera2base_link" type="continuous">
<parent link="base_link"/>
<child link="camera"/>
<origin xyz="0.19 0 0.05" rpy="0 0 0 "/>
<axis xyz="0 0 1"/>
</joint>
<link name="left_wheel">
<visual>
<geometry>
<cylinder radius="0.038" length="0.018" />
</geometry>
<origin xyz="0 0 0" rpy="1.5705 0 0" />
<material name="black">
<color rgba="0.0 0.0 0.0 1.0" />
</material>
</visual>
</link>
<joint name="left_wheel2base_link" type="continuous">
<parent link="base_link" />
<child link="left_wheel" />
<origin xyz="0 0.1 -0.0225" />
<axis xyz="0 1 0" />
</joint>
<link name="right_wheel">
<visual>
<geometry>
<cylinder radius="0.035" length="0.018" />
</geometry>
<origin xyz="0 0 0" rpy="1.5705 0 0" />
<material name="black">
<color rgba="0.0 0.0 0.0 1.0" />
</material>
</visual>
</link>
<joint name="right_wheel2base_link" type="continuous">
<parent link="base_link" />
<child link="right_wheel" />
<origin xyz="0 -0.1 -0.0225" />
<axis xyz="0 1 0" />
</joint>
<link name="front_wheel">
<visual>
<geometry>
<sphere radius="0.01" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="black">
<color rgba="0.0 0.0 0.0 1.0" />
</material>
</visual>
</link>
<joint name="front_wheel2base_link" type="continuous">
<parent link="base_link" />
<child link="front_wheel" />
<origin xyz="0.18 0 -0.06" />
<axis xyz="1 1 1" />
</joint>
<link name="back_wheel">
<visual>
<geometry>
<sphere radius="0.01" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="black">
<color rgba="0.0 0.0 0.0 1.0" />
</material>
</visual>
</link>
<joint name="back_wheel2base_link" type="continuous">
<parent link="base_link" />
<child link="back_wheel" />
<origin xyz="-0.18 0 -0.06" />
<axis xyz="1 1 1" />
</joint>
<link name="support">
<visual>
<geometry>
<cylinder radius="0.01" length="0.15" />
</geometry>
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
<material name="red">
<color rgba="0.8 0.2 0.0 0.8" />
</material>
</visual>
</link>
<joint name="support2base_link" type="fixed">
<parent link="base_link" />
<child link="support" />
<origin xyz="0.15 0 0.12" />
</joint>
<link name="laser">
<visual>
<geometry>
<box size="0.02 0.04 0.03" />
</geometry>
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
<material name="black" />
</visual>
</link>
<joint name="laser2support" type="fixed">
<parent link="support" />
<child link="laser" />
<origin xyz="0 0 0.07" />
</joint>
</robot>
7、整个导航建图视频演示
slam导航建图视频展示