使用gmapping方法利用turtlebot底盘移动信息和激光雷达数据进行建图。
sudo apt-get install ros-melodic-move-base*
sudo apt-get install ros-melodic-map-server*
sudo apt-get install ros-melodic-amcl*
sudo apt-get install ros-melodic-navigation*
sudo apt-get install ros-melodic-openslam-gmapping
在turtlebot_ws/src/turtlebot_apps/turtlebot_navigation/launch/includes/gmapping/
目录下新建文件rplidar_gmapping.launch.xml
<launch><arg name="scan_topic" default="scan" /><arg name="base_frame" default="base_footprint"/><arg name="odom_frame" default="odom"/><node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen"><param name="base_frame" value="$(arg base_frame)"/><param name="odom_frame" value="$(arg odom_frame)"/><param name="map_update_interval" value="0.01"/><param name="maxUrange" value="4.0"/><param name="maxRange" value="5.0"/><param name="sigma" value="0.05"/><param name="kernelSize" value="3"/><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="minimumScore" value="30"/><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="linearUpdate" value="0.05"/><param name="angularUpdate" value="0.0436"/><param name="temporalUpdate" value="-1.0"/><param name="resampleThreshold" value="0.5"/><param name="particles" value="8"/><param name="xmin" value="-1.0"/><param name="ymin" value="-1.0"/><param name="xmax" value="1.0"/><param name="ymax" value="1.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"/><remap from="scan" to="$(arg scan_topic)"/>node>
launch>
在turtlebot_ws/src/turtlebot_apps/turtlebot_navigation/launch/
目录下新建文件rplidar_gmapping_demo.launch
<launch><arg name="2D_laser" default="rplidar"/><include file="$(find rplidar_ros)/launch/rplidar.launch">include><arg name="custom_gmapping_launch_file" default="$(find turtlebot_navigation)/launch/includes/gmapping/$(arg 2D_laser)_gmapping.launch.xml"/><include file="$(arg custom_gmapping_launch_file)"/><include file="$(find turtlebot_navigation)/launch/includes/move_base.launch.xml"/>launch>
对turtlebot_ws/src/rplidar_ros/launch
目录下的文件rplidar.launch
进行修改,添加一句
<node pkg="tf" type="static_transform_publisher" name="base_to_laser" args="0.0 0.0 0.18 0.0 0.0 1.0 0.0 base_link laser 100"/>
注意要添加在前一个
后面,并且注意空格。
roscore
roslaunch turtlebot_bringup minimal.launch
roslaunch turtlebot_navigation rplidar_gmapping_demo.launch
rviz
将map数据Add
进来,并选择好话题。
启动键盘控制,可以看到rviz程序中显示的地图在发生变化。
roslaunch turtlebot_teleop keyboard_teleop.launch
查看tf树和graph图
rosrun rqt_tf_tree rqt_tf_tree
rqt_graph
得到一张如下图所示的建图结果。
此时分析一下工作中的节点和信息流
保存地图的操作如下,将得到一张图片和一个地图配置文件。
rosrun map_server map_saver -f <path>
自学rosbag,理解时间戳概念,写出rosbag的相关指令,利用rosbag储存的信息和gmapping,完成建图。
在控制turtlebot执行运动和建图之前,首先打开一个终端运行
rosbag record -a
录制完成后,在该终端按Ctrl+C结束录制,生成了数据包。
断开turtlebot、激光雷达与计算机的连接,重新开启终端,执行
roscore
roslaunch turtlebot_navigation rplidar_gmapping_demo.launch
rviz
rosbag play <filename>.bag
使用中国大学慕课网《机器人操作系统入门》课程的仿真环境,其代码的位置为:
Kinetic:https://github.com/DroidAITech/ROS-Academy-for-Beginners/tree/kinetic
Melodic:https://github.com/DroidAITech/ROS-Academy-for-Beginners/tree/melodic
创建工作空间,将上面链接中下载的代码放入src目录中,进行编译即可。
可能会遇到cmake
报错,提示qt
出现问题,需要安装qt,参考:
成功编译后,运行
roscore
roslaunch robot_sim_demo robot_spawn.launch
roslaunch slam_sim_demo gmapping_demo.launch
roslaunch slam_sim_demo view_slam.launch
可以使用rviz
中2D Nav Goal
工具指定目标位姿,使机器人运动起来。
引言 在这个-SLAM建图和导航仿真实例-项目中,主要分为三个部分,分别是 (一)模型构建(二)根据已知地图进行定位和导航(三)使用RTAB-MAP进行建图和导航 该项目的slam_bot已经上传我的Github。 这是第三部分,完成效果如下 图1 建图和导航 三、使用RTAB-Map进行建图和导航 1. rtab...
引言 在这个-SLAM建图和导航仿真实例-项目中,主要分为三个部分,分别是 (一)模型构建(二)根据已知地图进行定位和导航(三)使用RTAB-MAP进行建图和导航 该项目的slam_bot已经上传我的Github。 由于之前的虚拟机性能限制,我在这个项目中使用了新的ubantu 16.04环境,虚拟机配置 内存 8GCPU...
[{name:1},{name:2}].forEach((v,i,ar) => {console.log(v,i,ar)});//基础遍历[{name:1},{name:2}].map((v) => v.name);//[1,2]返回对象数组中指定字段值的一位数组(不改变原始数组)[{name:1},{name:2},{name:3}...
前言 我们知道Java/Python这种语言能够很好得 支持反射。反射机制 就是一种用户输入的字符串到对应实现方法的映射,比如http接口中 用户传入了url,我们需要调用该url对应的方法/函数对象 从而做出对应的操作。 而C++ 并没有友好得支持这样的操作,而最近工作中需要通过C++实现http接口,这个过程想要代码实现得优雅...
翻页器
在src/main/resources/springmvc-servlet.xml中加入
本篇仅仅是一个记录 MergeOperator 的使用方式。 Rocksdb 使用MergeOperator 来代替Update 场景中的读改写操作,即用户的一个Update 操作需要调用rocksdb的 Get + Put 接口才能完成。 而这种情况下会引入一些额外的读写放大,对于支持SQL这种update 频繁的场景来说实在是不划...
看了很多人写的好几个去重方法,我在这里精简组合下,适用于已排序与未排序的数组。 废话不多说,上代码。