保存地图
前文利用自己搭建的环境运行gmapping算法构建地图
保存地图:
rosrun map_server map_saver -f ~/map
保存为一个.pgm及,yaml的地图
关闭所有的进程,重新打开相关进程
安装amcl
sudo apt install ros-<ROS版本>-navigation
关于launch文件的实现,在amcl功能包下的example目录已经给出了示例
roscd amcl
ls examples #查看示例文件
该目录下会列出两个文件: amcl_diff.launch 和 amcl_omni.launch 文件,前者适用于差分移动机器人,后者适用于全向移动机器人,可以按需选择。
参考前者,新建 launch 文件,复制 amcl_diff.launch 文件内容到catkin_ws/src内相应文件夹内并修改如下,文件名为amcl.launch:
<launch>
<node pkg="amcl" type="amcl" name="amcl" output="screen">
<!-- Publish scans from best pose at a max of 10 Hz -->
<param name="odom_model_type" value="diff"/><!-- 里程计模式为差分 -->
<param name="odom_alpha5" value="0.1"/>
<param name="transform_tolerance" value="0.2" />
<param name="gui_publish_rate" value="10.0"/>
<param name="laser_max_beams" value="30"/>
<param name="min_particles" value="500"/>
<param name="max_particles" value="5000"/>
<param name="kld_err" value="0.05"/>
<param name="kld_z" value="0.99"/>
<param name="odom_alpha1" value="0.2"/>
<param name="odom_alpha2" value="0.2"/>
<!-- translation std dev, m -->
<param name="odom_alpha3" value="0.8"/>
<param name="odom_alpha4" value="0.2"/>
<param name="laser_z_hit" value="0.5"/>
<param name="laser_z_short" value="0.05"/>
<param name="laser_z_max" value="0.05"/>
<param name="laser_z_rand" value="0.5"/>
<param name="laser_sigma_hit" value="0.2"/>
<param name="laser_lambda_short" value="0.1"/>
<param name="laser_lambda_short" value="0.1"/>
<param name="laser_model_type" value="likelihood_field"/>
<!-- <param name="laser_model_type" value="beam"/> -->
<param name="laser_likelihood_max_dist" value="2.0"/>
<param name="update_min_d" value="0.2"/>
<param name="update_min_a" value="0.5"/>
<!--设置坐标系:odom、map 和 机器人基坐标系-->
<param name="odom_frame_id" value="odom"/><!-- 里程计坐标系 -->
<param name="base_frame_id" value="base_footprint"/><!-- 添加机器人基坐标系 -->
<param name="global_frame_id" value="map"/><!-- 添加地图坐标系 -->
<param name="resample_interval" value="1"/>
<param name="transform_tolerance" value="0.1"/>
<param name="recovery_alpha_slow" value="0.0"/>
<param name="recovery_alpha_fast" value="0.0"/>
</node>
</launch>
编写launch文件
文件名
amcl_launch.launch
内容如下
<launch>
<launch>
<!-- 设置地图的配置文件 -->
<arg name="map" default="map.yaml" />
<!-- 运行地图服务器,并且加载设置的地图-->
<node name="map_server" pkg="map_server" type="map_server" args="$(find turtlebot3_gazebo)/map/$(arg map)"/> #在turtlebot3_gazebo下新建一个文件夹map,将保存的地图复制到该文件夹中
<!-- 启动AMCL节点 -->
<include file="$(find turtlebot3_gazebo)/launch/amcl.launch" />
<!-- 运行rviz -->
<node pkg="rviz" type="rviz" name="rviz"/>
</launch>
改完launch文件按照惯例在工作空间catkin_ws下
source ~/catkin_ws/devel/setup.bash
打开gazebo
roslaunch turtlebot3_gazebo turtlebot3_world_test.launch #斜杠为我自己构建场景的launch文件 前面 turtlebot3_gazebo为launch文件所在文件夹
控制移动
roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
打开amcl
roslaunch之前编写的launch文件就🆗了
roslaunch turtlebot3_gazebo amcl_launch.launch
在启动的 rviz 中,添加RobotModel、Map组件,分别显示机器人模型与地图,添加 posearray 插件,设置topic为particlecloud来显示 amcl 预估的当前机器人的位姿,箭头越是密集,说明当前机器人处于此位置的概率越高
出现问题:RLException: [amcl_launch.launch] is neither a launch file in package [turtlebot3_gazebo] nor is [turtlebot3_gazebo] a launch file name
出现该问题,输入
source ~/catkin_ws/devel/setup.bash
然后重新roslaunc即可
由于每次都需要重新输入一下,所以可以将其写到终端开启文件./bashrc中去
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
打开./bashrc文件查看,可以看到最后面写入了该语句
gedit ~/.bashrc
这也以后就不用再多次输入了