零、前言
工作空间:/home/gfp/demo06_ws_7_2
新加文件
nav01_slam.launch
主要功能包
gmapping(首次需安装)
核心节点
slam_gmapping,该节点包含“订阅的Topic、发布的Topic、服务、相关参数” gmapping节点相关launch文件:具体就是配置上面说的这几项的配置。详细见网站。
代码
<launch>
<param name="use_sim_time" value="true"/>
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen"> <!--gmapping包的核心节点就叫slam_gmapping,name随便取的-->
<remap from="scan" to="scan"/> <!--雷达发布消息时,就叫scan-->
<!-- 二、【坐标系设置】 -->
<param name="base_frame" value="base_footprint"/><!--机器人基坐标系base_frame,必须设置为底盘坐标系base_footprint-->
<param name="map_frame" value="map"/> <!--地图坐标系,设置为map或者随便写一个都可以-->
<param name="odom_frame" value="odom"/> <!--里程计坐标系-,设置为odom或者随便写一个都可以-->
<!-- 【各个参数设置】 -->
<param name="map_update_interval" value="5.0"/> <!--地图更新时间 5s-->
<param name="maxUrange" value="16.0"/><!--雷达最大扫描距离 16m-->
<!-- 下面可以使用默认值 -->
<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" /> <!--Rviz显示机器人模型时使用-->
<node pkg="robot_state_publisher" name="robot_state_publisher" type="robot_state_publisher" /> <!-- 坐标变换:雷达坐标系→基坐标系-->
<node pkg="rviz" type="rviz" name="rviz" />
<!-- 可以保存 rviz 配置并后期直接使用-->
<!-- <node pkg="rviz" type="rviz" name="rviz" args="-d $(find nav_demo)/config/nav_test.rviz" /> -->
</launch>
一、启动ros核心,以及添加环境变量
roscore(只需启动一次) source ./devel/setup.bash (每个终端都需要,并在工作空间source才起效)
二、先启动 Gazebo 仿真环境(此过程略)
roslaunch urdf02_gazebo demo03_env.launch(这个是自己写的仿真环境文件,仅用于仿真)
三、然后再启动地图绘制的 launch 文件:
roslaunch 包名 launch文件名 roslaunch nav_demo nav01_slam.launch(详见上面代码部分)
四、启动键盘键盘控制节点,用于控制机器人运动建图
rosrun teleop_twist_keyboard teleop_twist_keyboard.py (安装指令:sudo apt-get install ros-melodic-teleop-twist-keyboard )
五、在 rviz 中添加组件,显示栅格地图
1. 在rviz中添加机器人模型:
2. 添加雷达数据
3. 添加TF组件(可加可不加)
odmo就是底盘发送的里程计相关的坐标变换
map就是slam发布的坐标系变换
在初始位置时,base_footprint和上面odmo以及map三者是基本重合的,但满足“base_footprint指向odom,odom指向map的关系”。
随着车子的行走,odom和map会偏移的越来越多。
4. 通过slam构建地图
注意区分:一个是话题,另一个是根坐标系。
- **Map中的Topic选择/map:**这是一个Topic(slam_gmapping节点发布的Topic),是固定的,不可自定义的。
- **Global Options中的Fixed Frame选择map:**这个是根坐标系。自定义名称为map。
5. 将配置另存为一个rviz文件,方便以后直接调用
6. 绘制地图
在rviz中,让小车绕着地图走一圈(通过键盘节点控制运动,rviz和gazebo会同步运动),地图就能绘制完毕了。